본문 바로가기
IT/Java

@TransactionalEventListener 란?

by 성준하이 2023. 11. 13.
반응형

이전에 포스팅에서 Transactional 에 대한 포스팅과 EventListener 에 대해 다룬 포스팅이 있다.

먼저 읽고 오는것을 추천한다.

아래 참고 포스팅 참고바란다.

 

EventListener 부분을 확장해서 Transactional 을 입혔다고 생각하면 된다.

아래 예시코드에서 설명하면.

private final ApplicationEventPublisher eventPublisher;
private final EventRepository repository;


@Transactional
public void transactionalListener() {
     InsertTableEntity entt = new InsertTableEntity();
     entt.setId("2");
     entt.setName("2");
     eventPublisher.publishEvent(entt);
     repository.insert(entt);


     //throw new RuntimeException();
}

EventListener 처럼 ApplicationEventPublisher 를 주입 받아서 publishEvent 를 호출하는것까진 동일하다.

그럼 Handler 부분은 어떻게 구현이 되어있는지 확인하면.

@Component
@RequiredArgsConstructor
public class MyTransactionalEventHandler {

     private final EventRepository repository;

     @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
      public void BEFORE_COMMIT(InsertTableEntity entt) {
         System.out.println("TransactionPhase.BEFORE_COMMIT");
     }

     @TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
     public void AFTER_COMPLETION(InsertTableEntity entt) {
         System.out.println("TransactionPhase.AFTER_COMPLETION");
     }

     @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
     public void AFTER_COMMIT(InsertTableEntity entt) {
         repository.insert3(entt);
         System.out.println("TransactionPhase.AFTER_COMMIT");
     }     

     @TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
     public void AFTER_ROLLBACK(InsertTableEntity entt) {
         repository.insert2(entt);
         System.out.println("TransactionPhase.AFTER_ROLLBACK");
     }

}

총 4가지의 Handler 를 볼수 있다.

BEFORE_COMMIT Commit 직전에 호출(Transaction 시작 전이 아니라 다 돌고 commit 직전이다.)
AFTER_COMMIT Commit 직후에 호출
AFTER_ROLLBACK Rollback 직후에 호출
AFTER_COMPLETION Transactional 내 모든 작업이 완료된 후 호출 (성공 실패 여부 상관없음)

의 경우에 각각 호출이 되는 메서드이다.

 

일단 Service에서는 별 문제없이 Transaction이 동작하고 종료하기에 

TransactionPhase.BEFORE_COMMIT

TransactionPhase.AFTER_COMPLETION

TransactionPhase.AFTER_COMMIT

순서로 print가 된다.

COMPLETION 은 Tx 내에 모든 로직을 수행하고 난 후이며, Commit은 최종 Commit이라서 Commit가 더 뒤에 출력된다.

 

그리고 Service에서 만약 

빨간 부분이 돌게 된다면 Rollback 부분의 handler 가 호출이 되게 된다.

 


참고 포스팅

https://thenicesj.tistory.com/619

 

@Transactional annotation

spring에서 사용하는 annotation 중 하나인 이 Transactional annotation에 대해 소개하려고 한다. 사용은 메서드 상단에 설정을 해준다. 예제는 아래와 같다. @Transactional public void interal() { serviceA.transactionalTe

thenicesj.tistory.com

https://thenicesj.tistory.com/748

 

@EventListener 란? (ApplicationEventPublisher, publishEvent)

현재는 다른 좋은 방법들이 많아서 잘 사용되지 않지만 개념에 대해서 알고 가고자 포스팅을 남긴다. 기존에 아래 사진과 같은 비지니스가 있다고 하면 하나의 비지니스가 너무 길고 간단하게

thenicesj.tistory.com

 

반응형

댓글