반응형
이전에 포스팅에서 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
https://thenicesj.tistory.com/748
반응형
'IT > Java' 카테고리의 다른 글
추가 설정 파일 사용하기(properties / yml) (43) | 2023.11.17 |
---|---|
@Transactional 사용시 주의 사항4 (propagation(전파속성) 에 대해) (45) | 2023.11.14 |
@EventListener 란? (ApplicationEventPublisher, publishEvent) (52) | 2023.11.12 |
equals 함수 (equalsIgnoreCase) (42) | 2023.11.09 |
if/else 동작 방식 (45) | 2023.11.08 |
댓글