개발/Spring Boot
-
달리는 자동차의 타이어를 교체하기 : Stored Procedure 기반 데이터 접근 방식에서 ORM 기반으로 전환 (2)개발/Spring Boot 2025. 3. 20. 09:42
이 글은 Stored Procedure에서 ORM으로 전환하는 여정을 다루는 시리즈의 두 번째 글입니다. 첫 번째 글에서는 기존 시스템의 Stored Procedure 기반 데이터 접근 방식과 그 한계에 대해 살펴보았습니다. 이제 본격적인 전환 과정과 그 과정에서 직면했던 다양한 난관, 그리고 이를 해결하기 위해 취했던 접근 방식에 대해 자세히 설명해보려고 합니다.Stored Procedure에서 ORM으로의 전환 과정에서의 난관과 해결 전략1. 기존 SP의 복잡한 의존성 구조 파악Stored Procedure(SP)에서 ORM으로 전환하는 과정에서 가장 먼저 직면한 문제는 SP의 복잡한 호출 관계였습니다. 기존 시스템에서는 SP들이 다양한 함수(FN)를 호출하며 강한 의존성을 가지고 있었으며, 단순히 ..
-
달리는 자동차의 타이어를 교체하기 : Stored Procedure 기반 데이터 접근 방식에서 ORM 기반으로 전환 (1)개발/Spring Boot 2025. 3. 18. 21:47
나는 IT가 주된 핵심이 아닌 고전적인 서비스 기업에서 웹 개발자로 근무하고 있다. 이 회사는 다수의 서비스를 운영하고 있으나, 대부분은 과거에 구축된 레거시 아키텍처를 기반으로 현재까지 유지보수되고 있다. 나는 이런 환경에서 레거시 시스템을 모던 아키텍처로 전환하는 과정을 직접 겪어보았기에, 그 경험을 기록하고 나누고자 이 글을 작성하게 되었다.특히 기존에 Stored Procedure(이하 SP) 기반으로 동작하던 시스템을 ORM 기반으로 전환하는 과정에서 겪은 어려움과 해결 방법 그리고 그 전환이 가져다 준 이점등을 집중적으로 다룰 예정이다. 이 글은 그 여정에서 얻은 경험과 인사이트를 공유함으로써 비슷한 고민을 하는 사람들에게 도움을 주는 것을 목표로 한다.운영중인 시스템에서 Stored Pro..
-
(OCP)개방 폐쇄 원칙 위배를 극복한 전략 패턴 적용 사례개발/Spring Boot 2024. 7. 12. 14:39
public interface PhotoProvider { String crawlingImageURL(String page_url); byte[] getImageBytes(String image_url); String getHostname();}public abstract class AbstractPhotoProvider implements PhotoProvider { @Override public byte[] getImageBytes(String image_url) { return ConnectionAction.getImage(getHostname(), image_url); }}@Componentpublic class HaruFilm extends Abstr..
-
Redis Cache를 통해 이미지 조회 성능 개선하기개발/Spring Boot 2024. 5. 24. 23:52
기존의 이미지 조회 방식에서는 DB에 직접 접근하여 이미지를 가져오는 방식이었다. 우리 서버는 이미지를 조회할 때 항상 Snappy를 통해 압축 해제를 해야 했는데, Snappy의 성능이 아무리 좋아도 항상 일정한 오버헤드를 가진다는 문제가 있었다. 이로 인해 일반 DB 조회보다 더 많은 리소스를 소모하게 되어 성능 저하가 발생했다. 이러한 문제를 해결하기 위해 Image Cache를 구현해야 했다. 캐시를 통해 빈번하게 조회되는 이미지를 메모리에 저장하면, 데이터베이스에 직접 접근하는 빈도를 줄 일 수 있어 조회 성능이 크게 향상될 수 있다. 특히, Redis는 인 메모리 데이터 저장소로 매우 빠른 조회 속도를 제공하여 이미지 조회 성능을 극대화시킬 수 있다. Redis를 이용하여 Image Cache..
-
이미지 압축, 해제 성능 개선하기 - Snappy 도입을 통하여개발/Spring Boot 2024. 5. 24. 17:10
nGrinder를 사용하여 이미지 로드 API를 테스트하는 동안 서버가 다운되는 문제가 발생했다.초기에는 서버가 정상적으로 응답했지만, 가상 사용자가 점차 증가하면서 서버의 응답 속도가 느려지기 시작했다. 결국 사용자가 일정 수를 넘어서자 서버가 더 이상 요청에 응답하지 않고 다운되었다. 서버 로그를 확인해 보니 이미지 로드 API를 호출하는 중 문제가 발생하는 것을 확인할 수 있었고, 문제의 원인이 ImageUtil 클래스 내의 decompressImage 메서드를 호출하면서 발생함을 알게 되었다. 문제를 찾기 위해서는 먼저, 원래 서버에서 이미지 압축과 해제가 어떻게 이루어졌는지 다시 확인하는 과정이 필요하다. 서버에서는 Deflater와 Inflater를 사용하여 이미지 압축 및 해제를 수행한다. ..
-
유지보수가 용이하도록 아키텍처 구성하기개발/Spring Boot 2024. 5. 24. 10:35
여러 게시판을 만들어야 하는 프로젝트를 진행하면서, 유지보수가 용이한 구성에 대해 고민하게 되었다.여러 게시판을 효과적으로 관리하고 향후 발생할 수 있는 문제들을 최소화하기 위해어떤 방법을 사용했는지 블로그에 공유하겠다.모든 게시판 엔티티의 공통 부모 클래스인 추상 Board 클래스를 정의하여, 모든 Board Entity가 이 추상클래스를 상속받도록 했다. Board를 굳이 추상 클래스로 정의한 이유는 Board 자체를 인스턴스화할 수 없도록 하기 위해서이다. Board들을 위와 같이 구성함으로써 제네릭을 사용해 Repository 코드를 아래와 같이 단순화할 수 있었다.public interface BoardRepository extends JpaRepository {} BoardService에서 ..
-
아키텍처 개선에 대한 고민개발/Spring Boot 2024. 5. 23. 17:30
원래 아키텍처는 위와 같은 모습이었다.첫번째 개선에서는 다음과 같은 일을 했다. 서비스 간 의존 결합도를 줄이기 위해 인터페이스 도입각 서비스가 인터페이스를 통해 상호 참조될 수 있도록 하여 결합도를 낮췄다. 이를 통해 서비스 간의 결합도를 낮추고 유연성을 높였다.PhotoService의 재사용성을 높이기 위해 역할 분리PhotoService의 재사용성을 높이기 위해 EncryptionService에 의존적이었던 메소드를 삭제하고, Encryption 관련 역할과 책임을 PhotoService에서 분리했다. 이를 통해 PhotoService는 더욱 독립적이고 재사용 가능하게 만들었다.EncryptionService의 역할 재정의암호화 역할을 명확히 하기 위해 Encryption을 Service에서 Com..
-
Spring Boot 3.X 에 Swagger3를 추가하기개발/Spring Boot 2023. 7. 16. 22:24
스프링 프로젝트에 의존성을 추가해준다. Maven org.springdoc springdoc-openapi-starter-webmvc-ui 2.1.0 Gradle // https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.1.0' Swagger Configuration을 위한 클래스를 만들어준다. @Configuration public class SwaggerConfig { @Bean public OpenAPI springOpenAPI()..