Spring/Spring

[Spring][Data Access] 1-7. Transaction Manager: Transaction-bound Events

noahkim_ 2024. 8. 11. 11:49

1. Transaction-bound Events

Event

  • 트랜잭션 경계 내에서 발생하는 이벤트
  • 트랜잭션 상태에 따라 분리된 작업 실행 (후처리 작업 또는 알림 처리 )
  • 커스터마이징 가능

 

예제) OrderCreatedEvent

더보기
public class OrderCreatedEvent {

    private final Order order;

    public OrderCreatedEvent(Order order) {
        this.order = order;
    }

    public Order getOrder() {
        return order;
    }
}

예제) 이벤트 발행

더보기
@Service
@RequiredArgsConstructor
public class OrderService {

    private final ApplicationEventPublisher eventPublisher;

    @Transactional
    public void createOrder(Order order) {
        System.out.println("Order created: " + order);

        // 주문이 생성된 후 이벤트를 등록(게시)
        eventPublisher.publishEvent(new OrderCreatedEvent(order));
    }
}

 

@TransactionalEventListener

  • Spring에서는 트랜잭션의 상태에 맞춰 작업을 처리할 수 있음
  • 이벤트 리스너가 호출되도록 설정
Phase 설명 실행 시점
BEFORE_COMMIT 트랜잭션이 커밋되기 직전
커밋 이전 실행 (롤백 시 실행 안됨)
AFTER_COMMIT 트랜잭션이 정상적으로 커밋된 후
커밋 성공 후 실행
AFTER_ROLLBACK 트랜잭션이 롤백된 후 롤백 이후 실행
AFTER_COMPLETION 트랜잭션이 종료된 후 (커밋 or 롤백 관계없이)
모든 트랜잭션 종료 시점에 실행

 

 

예제) 이벤트 리스너

더보기
@Component
public class EmailNotificationListener {

    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void handleOrderCreatedEvent(OrderCreatedEvent event) {
        Order order = event.getOrder();
        // 이메일 보내기 로직
        System.out.println("Sending email notification for order: " + order);
    }
}

 

 

 

출처