서문필자는 원래 JPA를 잘 사용하지 않는다. 다양한 장점들(Easy CRUD, 객체 지향적 코드 등등..)이 있음에도 불구하고 높은 학습 곡선으로 인한 피로도가 상당했다.예를들면 관계 매핑이나 N+1 문제 또는 복잡한 쿼리 작성 시 결국 JPQL 등을 가져와 쿼리를 비슷하게 (결국 실제 SQL이랑은 또 다르다.) 쓰는 등 프로덕션 레벨의 코드를 쓰기엔 배워야할 것이 너무 많았다. 이럴거면 이해하기도 쉬운 MyBatis, jOOQ 등을 쓰는게 훨씬 이득이라 판단해 JPA는 늘 뒷전이었다.하지만 직장다니는 개발 인생이란게 늘 그렇듯 내가 원하는 기술로만 모든걸 개발할 수는 없는 법. 이직한 회사의 코드 중 레거시 코드는 JPA 였고, JPA 설정으로 인해 발생한 장애로 인해 이 글을 쓰게 되었다.Open ..
서문그대는 RDBMS Offset의 단점을 알고 있는가? 일반적으로 Offset은 Offset만큼 Row를 먼저 스캔한 후에 버림처리 하게 되어있다. 데이터의 양이 늘면 그만큼 선형적으로 시간복잡도가 늘며, Disk I/O가 다량 발생하여 느려진다.There crucial point here is that offset takes only one single parameter: the number of rows to be dropped. No more context. The only thing the database can do with this number is fetching and dropping that many rows. In other words, big offsets impose a lot o..
들어가며우리가 개발하는 어플리케이션은 생애주기 간 필연적으로 수정된다. 기반 기술이 변경(이를테면, DB의 변경, Client 라이브러리의 변경 등)되기도 하며, 요구사항이 바뀌기도 한다. 그렇기에 핵심 코드는 견고하게 관리하고 주변 요소들의 수정엔 크게 영향을 받지 않는 설계가 필요하다. 이를 가능하게 해주는 것이 헥사고날 아키텍처 (Hexagonal Architecture) 또는 포트와 어댑터 아키텍처(Ports and Adapters Architecture)다.대부분 레거시 코드의 경우 레이어드 아키텍처일 확률이 매우 높다. 레이어드 아키텍처는 이해하기 쉽고, 첫 개발의 시작 속도가 빠르단 장점이 있지만, 단점 또한 명확하다. 우선, DB Layer의 토대로 각 계층이 쌓이기 때문에 개발자로 하여금..
1. 개요 의존성 역전 원칙(Dependency Inversion Principle)은 객체 지향 설계 원칙 중 하나이다. SOLID 중 D가 바로 의존석 역전 원칙이다. 시스템의 고수준 모듈(비즈니스 로직 등의 세부 구현)이 저수준 모듈(데이터 엑세스 등)에 직접적으로 의존하는 것을 피하고, 대신 둘 모두가 추상화에 의존하도록 설계하는 원칙이다. 의존성 역전 원칙이 구현되어 있지 않은 프로젝트의 경우 유닛 테스트가 쉽지 않다. 일반적인 레이어드 아키텍처의 스프링 프로젝트들은Controller - Service - Repository 순으로 모두 직접 의존하게 되어 있는 경우가 많다. 이런 프로젝트들은 단위 테스트 작성이 매우 까다롭다. 데이터베이스 연결이 필요한 환경에서 테스트를 실행하거나, 테스트 데..
개요 // 현재 운영 서비스에 적용되어 있는 극단적인 예시 // if문 지옥 if (!lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSomeStringField.equalsIgnoreCase(SomeCase) && !lSom..
1. 기술 스택 정보 Server Framwork : Spring boot 2.2.1.RELEASE Client Library : Jersey (spring-boot-starter-jersey:2.2.1.RELEASE) Logging Library log4jdbc-log4j2:1.16 logback:1.2.9 (slf4j) 2. RequestFilter 작성 Jersey 라이브러리의 ContainerRequestFilter, ContainerResponseFilter Interface를 구현하여 작성한다. public class ApiFilter implements ContainerRequestFilter, ContainerResponseFilter { @Context private HttpServlet..
1. 시행 개요 MSA (Micro Service Architecture) 현재 담당하는 업무는 각각 독립된 역할을 하는 여러 서비스 (약 40여개의 서비스 존재)들로 구성되어 있다. Interface, Core 처리, Gateway 등 각 역할에 맞는 서비스들이 존재하며 유기적으로 연결되어 있다. 각 서비스는 작고 독립적이며 느슨하게 결합되어 있다. 때문에 서비스 각 독립적으로 배포할 수 있다는 장점이 있다. 단점으로는 서비스 간 통신이 필요하다는 점이다. 이로 인해 복잡해질 수 있으며, 상호작용 테스트가 어렵다. 또한 통합 유지관리가 어렵다는 단점이 존재한다. 위의 관점에서 보았을 때 현 업무는 통합 관리가 정상적으로 이뤄지지 않고 있다. 각 Transaction 이 유기적으로 어떻게 연결되는 지 업..
Native Memory Leak Detection. 1. 개요 java.lang.OutOfMemoryError: Direct buffer memory 협력 업체에서 통신이 안된단 연락을 받고 해당 프로세스의 로그를 열었을 때 위 에러가 제일 먼저 반겨주었다. Java는 일반적으로 Heap 메모리 영역을 이용하는 경우 JVM에서 관리를 하지만, Direct Buffer를 이용해 네이티브 메모리 영역을 사용하는 경우도 있다. 일례로 java.nio.DirectByteBuffer를 이용하는 경우인데, HeapByteBuffer와 다르게 DirectByteBuffer는 성능적으로 유리하단 점이 있어 DirectMemoryAccess(DMA)를 활용한다. 그런고로 Heap Memory 처럼 Garbage Col..