@EventListener와 @TransactionEventListener는 둘 다 Spring에서 이벤트 리스닝을 위해 사용되지만 트랜잭션 처리 여부에 따라 다르게 작동합니다. 각 어노테이션의 차이와 사용 사례를 통해 자세히 비교해 볼게요.🤔
@EventListener
- 기능: 특정 이벤트를 구독하여 이벤트 발생 시 해당 메서드를 실행하도록 합니다.
- 트랜잭션 의존성: 트랜잭션 상태에 관계없이 이벤트가 발생할 때마다 실행됩니다.
- 사용 사례: 트랜잭션과 무관하게 즉시 실행해야 하는 작업이 있는 경우에 적합합니다.
예를 들어, 간단한 로그 남기기, 로그 남기기, 알림 전송 등입니다. - 장점: 트랜잭션 상태와 상관없이 빠르게 이벤트 처리할 수 있습니다.
- 단점: 트랜잭션이 취소되더라도 이벤트는 이미 발생했기 때문에 롤백된 데이터를 참조할 위험이 있습니다.

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

@EventListener VS @TransactionEventListener
| 특성 | @EventListener | @TransactionEventListener |
| 트랜잭션 의존성 | 트랜잭션과 무관하게 작동 | 트랜잭션 상태에 따라 작동 |
| 주 사용 시점 | 즉시 실행해야 하는 경우 | 트랜잭션 성공 또는 특정 단계 후 실행 시 |
| 주의사항 | 트랜잭션 롤백 시 데이터 일관성 문제 가능 | 트랜잭셩 종료 후 실행으로 안전성 보장 |
| 주요 사용 예시 | 로그, 단순 알림 등 트랜잭션과 무관한 작업 | 데이터베이스 갱신 후 후속 작업 |
- @EventListener는 트랜잭션 상태와 상관없이 빠르게 실행되어야 하는 작업에 적합합니다.
- @TransactionalEventListener는 트랜잭션 상태를 반영하여 안정적인 데이터 일관성이 필요한 경우에 유리합니다.
'Backend > Spring' 카테고리의 다른 글
| [Spring] @Async로 비동기 작업 최적화하기 (0) | 2024.11.08 |
|---|---|
| 동시성 문제 해결을 위한 ThreadLocal 이해하기 (1) | 2024.11.02 |
| [Spring] 스프링에서 이벤트 발행과 구독 @EventListener (0) | 2024.10.25 |
| [Spring] 트랜잭션 상태에 맞춘 이벤트 처리 @TransactionalEventListener (0) | 2024.10.25 |
| [Spring] HikariCP 동작 방식 (1) | 2024.09.29 |