Backend/Spring

[Spring] @EventListener VS @TransactionEventListener

누구세연 2024. 10. 26. 00:02

@EventListener와 @TransactionEventListener는 둘 다 Spring에서 이벤트 리스닝을 위해 사용되지만 트랜잭션 처리 여부에 따라 다르게 작동합니다. 각 어노테이션의 차이와 사용 사례를 통해 자세히 비교해 볼게요.🤔

 

@EventListener

  • 기능: 특정 이벤트를 구독하여 이벤트 발생 시 해당 메서드를 실행하도록 합니다.
  • 트랜잭션 의존성: 트랜잭션 상태에 관계없이 이벤트가 발생할 때마다 실행됩니다.
  • 사용 사례: 트랜잭션과 무관하게 즉시 실행해야 하는 작업이 있는 경우에 적합합니다.
    예를 들어, 간단한 로그 남기기, 로그 남기기, 알림 전송 등입니다.
  • 장점: 트랜잭션 상태와 상관없이 빠르게 이벤트 처리할 수 있습니다.
  • 단점: 트랜잭션이 취소되더라도 이벤트는 이미 발생했기 때문에 롤백된 데이터를 참조할 위험이 있습니다.

@EventListener 사용예시

 

@TransactionEventListener

  • 기능: 이벤트가 트랜잭션 경계 내에서 발생하는지 확인하고 특정 트랜잭션 단계에서만 이벤트를 리스닝합니다.
  • 트랜잭션 의존성: 트랜잭션의 상태에 따라 이벤트를 처리할 수 있으며 AFTER_COMMIT, BEFORE_COMMIT, AFTER_ROLLBACK, AFTER_COMPLETION 단계 중 하나로 설정할 수 있습니다.
  • 사용 사례: 트랜잭션이 성공적으로 커밋된 후에만 실행해야 하는 작업에 적합합니다.
    예를 들어, 데이터베이스에 사용자가 성공적으로 등록된 후 이메일을 보내는 경우입니다.
  • 장점: 트랜잭션 상태에 따라 이벤트 실행 여부를 결정할 수 있어 롤백 시 불필요한 이벤트 처리를 방지합니다.
  • 단점: 트랜잭션 상태에 의존하므로 단순한 이벤트 리스너보다 설정이 복잡할 수 있습니다.

@TransactionEventListener 사용예시

 

 

@EventListener VS @TransactionEventListener

특성 @EventListener @TransactionEventListener
트랜잭션 의존성 트랜잭션과 무관하게 작동 트랜잭션 상태에 따라 작동
주 사용 시점 즉시 실행해야 하는 경우  트랜잭션 성공 또는 특정 단계 후 실행 시
주의사항 트랜잭션 롤백 시 데이터 일관성 문제 가능 트랜잭셩 종료 후 실행으로 안전성 보장
주요 사용 예시 로그, 단순 알림 등 트랜잭션과 무관한 작업 데이터베이스 갱신 후 후속 작업

 

 

  • @EventListener는 트랜잭션 상태와 상관없이 빠르게 실행되어야 하는 작업에 적합합니다.
  • @TransactionalEventListener는 트랜잭션 상태를 반영하여 안정적인 데이터 일관성이 필요한 경우에 유리합니다.