ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring : 이벤트 리스너 기본 개념 (@EventListener, @TransactionalEventListener)
    각종 학습 요약/Spring 2022. 7. 11. 17:36

    Spring : 이벤트 리스너 기본 개념 (@EventListener, @TransactionalEventListener)

    이 글에서는 스프링에서 이벤트를 처리하는 어노테이션을 소개합니다. 스프링에서는 이벤트 어노테이션을 통해서 어플리케이션 전체에 이벤트를 발행(Publish)할 수 있습니다. 어떻게 이벤트를 발행하고 어떻게 이벤트리스너를 구현하는지 알아보도록 할게요.

    @EventListener


    Spring 4.2 이상에서 이벤트를 처리하는 아주 간단한 방법으로 @EventListener가 적용되었습니다. 이로써 특정 클래스를 상속하지 않고도, 즉 스프링에 종속되지 않고 순수 POJO 객체만을 활용해서도 이벤트 프로그래밍이 가능합니다.

    간단한 사용 예시를 남겨보겠습니다.

    1. 이벤트를 발행할 쪽에서는 ApplicationEventPublisher 객체가 정의되어야 합니다. 이를 통해 이벤트를 발행합니다. 이것은 따로 예시를 적지 않겠습니다(평범하게 의존을 주입받으면 됩니다).
    2. 이벤트 정보를 담아서 전달할 이벤트 객체를 만들어야 합니다. 예시에선 MyEventPojo라는 이름으로 만들겠습니다.
    3. 이벤트 핸들러가 적절한 이벤트 리스너를 연결, 실행합니다. 예시에서는 MyEventHandler라는 이름으로 만들어 볼게요.
    4. 만약 이벤트리스너를 비동기(@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 - 트랜잭션이 커밋되기 전에 이벤트가 실행됩니다.

    마무리


    활용하기 위해서 찾아보며 공부했는데 생각보다 너무 쉽게 구현이 가능해서 이것저것 테스트해보며 즐겁게 공부한 시간이었던 것 같습니다.
    만약 저처럼 처음 이벤트 프로그래밍을 접하시는 분이 계시다면 도움이 되면 좋겠네요. 화이팅!

    댓글

Designed by Tistory.