Spring 프레임워크에서 ApplicationEventPublisher는 이벤트를 발행(publish)하는 역할을 담당하는 인터페이스
쉽게 말하면, "스프링 애플리케이션 내부에서 발생한 어떤 사건(이벤트)을 다른 컴포넌트들에게 알리는 메신저"를 의미한다.
Spring은 Observer 패턴을 기반으로 한 애플리케이션 이벤트 시스템을 갖고 있고, ApplicationEventPublisher는 이 이벤트 시스템의 “발사 버튼” 역할 수행
이걸 사용하는 예시 ? 약간 요런거에 쓰이는거 같음 !
1. 회원가입 후 email전송
2. 긴급 메세지 발송
비니스 로직을 한 클래스 내부에서 전부 처리하면 결합도가 높아지고 유지보수가 힘들어진다.
✅ 어떻게 동작할까
1. publisher가 이벤트를 발행
2. Spring 컨테이너는 해당 이벤트를 듣고 있는 @EventListener 또는 ApplicationListener 를 찾아 호출!
3. 이벤트 발행은 트랜잭션 내부에서 하면 리스너도 트랜잭션 영향을 받을 수 있음 -> 확실히 제어하려면 @TransactionalEventListener를 사용.
트랜잭션 phrase 별로 이벤트리스너 동작을 제어하고 싶을 경우에는
@TransactionalEventListener(phase=TransactionPhase.AFTER_COMMIT) 요러한 옵션들이 따로 존재함.