
1. 스프링이 구현한 Aggregate Root(애그리거트 루트)와 도메인 이벤트 [ Aggregate(애그리거트)와 도메인 이벤트 ] 도메인을 중심으로 하는 애플리케이션을 개발할 때 등장하는 개념으로 애그리거트가 있다. 애그리거트(Aggregate)란 관련된 객체들을 모아둔 하나의 단위로, 값 객체(Value Object)와 엔티티(Entity)로 구성된다. 그리고 애그리거트의 중심에는 애그리거트 루트가 존재하는데, 이를 애그리거트 루트(Aggregate Root)라고 부른다. 객체들은 애그리거트 루트를 중심으로 관리된다. (해당 포스팅은 이러한 내용을 자세히 다루는 것이 주목적이 아니므로 간략히만 살펴보도록 하자.) 이를 주문 도메인을 기준으로 그려보면 다음과 같다. 애그리거트 루트가 영속화 될 때 ..

1. EmptyResultDataAccessException 예외가 발생한 SQL 쿼리와 파라미터 로깅하기 [ 요구 사항 ] 서비스를 개발하다 보면 존재하지 않는 리소스에 접근하여 EmptyResultDataAccessException 에러가 발생하는 경우가 있다. 하지만 EmptyResultDataAccessException를 통해서는 어떤 쿼리의 어떤 파라미터로 인해 문제가 발생했는지 정확한 파악이 어렵다. 만약 여러 개의 레포지토리에 접근하는 중에 리소스를 접근하고 있다면 더욱 파악이 어렵다. 따라서 에러가 발생한 쿼리를 로깅하여 에러 로그를 보완하도록 하자. [ 기능 추가 ] 쿼리와 파라미터를 저장하기 위한 컨텍스트 추가 파라미터를 컨텍스트에 저장하기 위한 AOP 추가 실행 쿼리를 컨텍스트에 저장..

1. 가상 스레드(Virtual Thread)를 지원하기 위한 스프링의 작업들 스프링 부트(Spring Boot) 3.2부터 가상 스레드를 공식적으로 지원하기 시작했다. 스프링은 구체적으로 가상 스레드를 지원하기 위해 다음과 같은 작업들을 진행해왔는데, 각각 자세히 살펴보도록 하자. 가상 스레드 사용 여부 프로퍼티 추가 스레드 모델 Enum(Threading)과 Condition 어노테이션 추가 가상 스레드 사용 여부에 따른 빈 등록 [ 가상 스레드 사용 여부 프로퍼티 추가 ] 스프링 부트는 애플리케이션 구성을 위한 메타 데이터를 spring-boot-autoconfigure 모듈의 spring-configuration-metadata.json으로 관리한다. 가상 스레드를 지원하기 위한 프로퍼티 역시 해..

1. 스프링 @Transactional의 동작 방식에 대해 완벽하게 이해하기 [ parallelStream에서 @Transactional을 사용하는 예제 코드 ] 다음과 같은 간단한 JPA 엔티티가 있다. @Entity @Getter @NoArgsConstructor public class MyEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; public MyEntity(String name) { this.name = name; } } 그리고 해당 엔티티를 저장하는 서비스 계층에서 조건에 따라 런타임 예외를 던진다고 하자. @Service @Transactional(rea..
1. @PathVariable 또는 @RequestParam 등의 값을 변환하여 받기 (암호화된 @PathVaraible 값 복호화) [ 컨트롤러에서 받는 값 변환의 필요성 ] 애플리케이션을 개발하다 보면 리소스에 대한 고유한 값인 식별자(identifier)을 받아 요청을 처리하는 경우가 있다. 리소스의 식별자는 시스템 내부 정보이므로, 해당 값이 1씩 단순 증가하는 값이라면 암/복호화를 해서 사용해야 한다. 예를 들어 다음과 같이 특정 멤버의 포인트를 증가시키는 API가 있다고 하자. 이때 PathVariable로 받는 memberId 값은 암호화되어 있기 때문에 컨트롤러 혹은 이를 사용하는 하위 계층에 복호화 로직을 넣어주어야 한다. @RestController @RequiredArgsConstru..