[10분 테코톡] 멍구의 스프링@EventListener와 @TransactionalEventListener
- 스프링 이벤트는 애플리케이션 내에서 느슨한 결합과 관심사 분리를 돕는 도구로 활용될 수 있다. 🧩
@EventListener
는 이벤트 발생 시 즉시 실행되지만, 트랜잭션의 성공 여부와 관계없이 실행되는 문제점이 있다. 💥
@TransactionalEventListener
는 트랜잭션의 커밋 시점 이후에 실행되도록 제어하여 데이터 정합성을 높일 수 있다. ✅
@TransactionalEventListener
는 AFTER_COMMIT
, AFTER_ROLLBACK
등 다양한 속성을 통해 실행 시점을 세밀하게 조정할 수 있다. ⚙️
- 이벤트 로직이 실패해도 비즈니스 로직에 영향이 없다면
@EventListener
를, 트랜잭션 성공 후 실행되어야 한다면 @TransactionalEventListener
를 사용한다. 🤔
- 스프링 이벤트는 단일 애플리케이션 내에서만 유효하며, 메시지 유실 가능성이 존재한다. ⚠️
- 높은 신뢰도와 확장성이 필요한 서비스라면 메시지 브로커를 사용하는 이벤트 시스템을 고려해야 한다. 🚀
ApplicationEventPublisher
를 통해 이벤트 객체를 발행하고, ApplicationEventMulticaster
를 통해 리스너에 전달한다. 📣
- 이벤트 객체는 간단한 POJO(Plain Old Java Object) 형태의 DTO로 구현하는 것이 일반적이다. 📦
@Order
애너테이션을 사용하여 이벤트 리스너의 실행 순서를 지정할 수 있다. 🔢