스프링에서는 트랜잭션을 어떻게 처리하는가? (3)

정원식·2023년 12월 16일
0

스프링 트랜잭션

목록 보기
3/5

22년 12월 작성한 글입니다.

개요

  • 우리는 보통 @Transactional 어노테이션을 통해 트랜잭션을 처리합니다.
  • 해당 어노테이션은 어떻게 적용이 되는지
  • 그리고 스프링에서는 트랜잭션을 어떻게 처리하는지 알아봅니다. (5.3.18 기준)
  • 이번 챕터에서는 트랜잭션 바로 전후에 로직을 수행해야하는 경우에 어떻게 처리가능한지 알아봅니다.

TransactionalEventListener

  • 일반적으로 트랜잭션 커밋 바로 전후에 로직이 수행되어야하는 경우, @TransactionalEventListener 를 사용합니다.

TransactionalEventListenerFactory

  • @TransactionalEventListener 이 적용된 메서드는 TransactionalEventListenerFactory 를 통해 TransactionalApplicationListener 로 등록됩니다.
  • TransactionalApplicationListeneronApplicationEvent 를 통해 호출됩니다.
    • 이벤트가 발생했을때, 호출됩니다.
    • 해당 메서드 내부에서 TransactionalApplicationListenerSynchronizationTransactionSynchronizationManager 에 등록합니다.

TransactionSynchronization

  • 앞선 챕터에서 AbstractPlatformTranscationManager 의 commit, rollback 과정에서 TransactionSynchorinization 이 실행되는것으로 작성하였습니다.
  • 해당 실행 플로우는 아래와 같습니다.
  • TransactionalApplicationListenerSynchronizationTransactionSynchorinization 를 구현하였기에 commit, rollback 과정에서 호출됩니다.

TransactionalApplicationListener

  • TransactionalApplicationListener#onApplicationEvent 가 호출되었을때, TransactionalApplicationListenerSynchronizationTransactionSynchronizationManager 에 등록됩니다.
  • 트랜잭션 commit, rollback 과정에서 TransactionalApplicationListener$SynchronizationCallback 가 호출되고 아래와 같은 페이즈에 호출되도록 등록이 가능합니다.
    • BEFORE_COMMIT
    • AFTER_COMMIT
    • AFTER_ROLLBACK
    • AFTER_COMPLETION

결론

  • 트랜잭션 바로 전후에 로직을 수행해야하는 경우
    • TransactionSynchronization 를 TransactionSynchronizationManager 에 등록하거나
    • @TransactionalEventListener (TransactionalApplicationListener) 를 사용할수 있습니다.

Reference

spring-tx

profile
매일매일 성장하고 싶은 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보