-
Spring : 이벤트 리스너 기본 개념 (@EventListener, @TransactionalEventListener)각종 학습 요약/Spring 2022. 7. 11. 17:36
Spring : 이벤트 리스너 기본 개념 (@EventListener, @TransactionalEventListener)
이 글에서는 스프링에서 이벤트를 처리하는 어노테이션을 소개합니다. 스프링에서는 이벤트 어노테이션을 통해서 어플리케이션 전체에 이벤트를 발행(Publish)할 수 있습니다. 어떻게 이벤트를 발행하고 어떻게 이벤트리스너를 구현하는지 알아보도록 할게요.
@EventListener
Spring 4.2 이상에서 이벤트를 처리하는 아주 간단한 방법으로
@EventListener
가 적용되었습니다. 이로써 특정 클래스를 상속하지 않고도, 즉 스프링에 종속되지 않고 순수 POJO 객체만을 활용해서도 이벤트 프로그래밍이 가능합니다.간단한 사용 예시를 남겨보겠습니다.
- 이벤트를 발행할 쪽에서는
ApplicationEventPublisher
객체가 정의되어야 합니다. 이를 통해 이벤트를 발행합니다. 이것은 따로 예시를 적지 않겠습니다(평범하게 의존을 주입받으면 됩니다). - 이벤트 정보를 담아서 전달할 이벤트 객체를 만들어야 합니다. 예시에선
MyEventPojo
라는 이름으로 만들겠습니다. - 이벤트 핸들러가 적절한 이벤트 리스너를 연결, 실행합니다. 예시에서는
MyEventHandler
라는 이름으로 만들어 볼게요. - 만약 이벤트리스너를 비동기(@Async)로 실행하려고 한다면,
@Configuration
에@EnableAsync
를 함께 명시해야 합니다.
@Getter class MyEventPojo { private Long dataId; public EventPojo(Long dataId) { this.dataId = dataId; } } @Component public class MyEventHandler { @EventListener @Async public void onMyFirstEventListener(EmailEvent event) { Long id = event.getDataId(); // do something } @EventListener @Async public void onMySecondEventListener(EmailEvent event) { Long id = event.getDataId(); // do something } }
아주 간단하게 구현이 가능하죠?
하나의 이벤트에 여러개의 이벤트 핸들러/리스너가 존재한다면, 핸들러/리스너의 이름을 사전순으로 수행됩니다. 만약 여기에 순서를 주고 싶다면@EventListener
에@Order
를 주면 됩니다. Order의 요소가 작은 int값을 가질 수록 우선적으로 실행됩니다.@TransactionalEventListener
하나의 트랜잭션 경계 안에서 트랜잭션에 관련된 이벤트 처리를 하고 싶다면
@TransactionalEventListener
를 사용할 수 있습니다. 사용하는 방법은@EventListener
와 동일합니다. 다만 트랜잭션 간 이벤트 실행 시점을 결정하는phase
옵션을 줄 수가 있습니다.AFTER_COMMIT
- 트랜잭션 결과를 반영(commit)하고 난 시점에 이벤트가 실행됩니다. 기본값입니다.AFTER_ROLLBACK
– 트랜잭션에 rollback이 일어난 시점에 이벤트가 실행됩니다.AFTER_COMPLETION
– 트랜잭션이 끝났을 때(commit이든 rollback이든) 이벤트 실행됩니다.BEFORE_COMMIT
- 트랜잭션이 커밋되기 전에 이벤트가 실행됩니다.
마무리
활용하기 위해서 찾아보며 공부했는데 생각보다 너무 쉽게 구현이 가능해서 이것저것 테스트해보며 즐겁게 공부한 시간이었던 것 같습니다.
만약 저처럼 처음 이벤트 프로그래밍을 접하시는 분이 계시다면 도움이 되면 좋겠네요. 화이팅!'각종 학습 요약 > Spring' 카테고리의 다른 글
API 호출을 위한 세 가지 Spring 도구(Spring 6에서 새롭게 지원하는 HttpInterface) (0) 2023.03.17 Spring: Proxy를 통한 Spring Data Repository 초기화와 설정 (2) 2022.07.01 Spring: AOP의 기본적인 개념 & SpringAOP 훑어보기 (2) 2022.06.20 Error Handling: Spring에서 Exception 대응하기 (0) 2022.06.17 Spring: 의존관계 주입(DI, Dependency Injection) 방식 네 가지 요약 (0) 2022.06.16 Spring: IoC와 DI를 예시로 쉽게 이해해보자 (0) 2022.06.16 - 이벤트를 발행할 쪽에서는