역할트랜잭션 상태에 따라 이벤트 핸들러를 실행할 수 있음.예시 상황트랜잭션이 성공적으로 커밋된 후에만 이벤트 핸들러를 실행하도록 설정할 수 있다.트랜잭션 중 발생한 이벤트가 실제로 데이터베이스에 반영된 후에 처리되어야 할 때 유용어노테이션 사용@TransactionalEventListenerphase 속성을 통해 트랜잭션의 어떤 단계에서 이벤트 핸들러를 실행할지를 지정할 수 있습니다. TransactionPhase 열거형( ENUM )을 사용하여 다음과 같은 단계를 지정할 수 있다.BEFORE_COMMIT: 트랜잭션이 커밋되기 바로 전에 실행됩니다.AFTER_COMMIT: 트랜잭션이 성공적으로 커밋된 후에 실행됩니다.AFTER_ROLLBACK: 트랜잭션이 롤백된 후에 실행됩니다.AFTER_COMPLETI..
계산 로직과 도메인 서비스할인 금액 계산과 같이 애그리거트에 포함시키기 애매한 도메인 개념을 구현할 때도메인 서비스를 사용해서 해당 개념을 명시적으로 표현할 수 있음.서비스 응용 영역이 어떤 서비스에 대한 로직을 다루는 반면에 도메인 서비스에서는 도메인 로직과 관련되어 있지만 도메인 안에서 처리하기 더 범위가 넓은 개념의 로직을 해당 도메인 서비스 로 옮긴다.할인 금액 로직을 위한 DiscountCalculationServicepublic class DiscountCalculationService { public Money calculateDiscountAmounts( List orderLines, List coupons, MemberGrade grade) { Money couponDiscount = c..
개요외부 시스템이나 타 도메인과의 연동 기능도 도메인 서비스가 될 수 있음.도메인 서비스는 도메인의 로직 관점에서 인터페이스를 작성, 인프라스트럭처 영역에서 구현예시도메인 서비스 인터페이스public interface SurveyPermissionChecker { boolean hasUserCreationPermission(String userId); }응용 서비스public class CreateSurveyService { private SurveyPermissionChecker permissionChecker; public Long createSurvey(CreateSurveyRequest req) { validate(req); // 도메인 서비스를 이용해서 외부 시스템 연동을 표현 if (!perm..
문제 상황상황한 주문 애그리거트에 대해 운영자가 배송 상태로 변경하려고 하는 동안 사용자가 배송지 주소를 변경한다면 어떤 문제가 발생할까?상황 설명운영자 스레드:주문 애그리거트를 구함배송 상태로 변경트랜잭션 커밋고객 스레드:주문 애그리거트를 구함배송지 변경트랜잭션 커밋충돌!문제점운영자와 고객이 동시에 같은 주문 애그리거트를 수정할 때 발생한다.트랜잭션마다 리포지터리는 새로운 애그리거트 객체를 생성한다.운영자 스레드와 고객 스레드는 같은 주문 애그리거트를 나타내지만물리적으로 다른 객체를 사용한다.같은 Order라도 서로 다른 메모리주소를 가지며,속성도 다를 수 있음.운영자 스레드가 주문 애그리거트 객체를 배송 상태로 변경해도, 고객 스레드가 사용하는 객체에는 영향을 주지 않는다.고객 스레드는 주문 애그리거..
문제 상황@Entity public class Order { @Id private Long id; @Version private Long version; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List orderLines; // 기타 필드와 메서드 } @Entity public class OrderLine { @Id private Long id; private String product; private int quantity; @ManyToOne private Order order; // 기타 필드와 메서드 }@Service public class OrderService { @Persis..
개요아틀라시안의 컨플루언스의 경우 문서를 편집하는 경구 다른 사용자가 이미 편집중인 경우, 충돌 가능성을 사전에 안내하는 기능을 제공함.여러 사용자가 동시에 한 문서를 수정할 때 발생하는 충돌을 방지함.오프라인 선점 잠금?한 사용자가 문서를 편집할 때 다른 사용자가 해당 문서의 수정 화면을 열지 못하도록 하는 기능입니다.이는 단일 트랜잭션에서의 선점 잠금 방식과는 달리 여러 트랜잭션에 걸쳐 동시 변경을 방지할 수 있다고 한다.작동 원리사용자 A가 문서 수정 폼을 요청하면 시스템은 오프라인 잠금을 구한다.사용자 B가 동일한 문서의 수정 폼을 요청하면이미 잠금이 선점된 상태이므로 잠금을 구할 수 없고, 에러 화면이 표시됩니다.사용자 A가 수정을 완료하고 요청을 보내면시스템은 데이터를 수정하고오프라인 잠금을 ..