우당탕탕

Spring Framework의 @TransactionalEventListener: AFTER_COMMIT과 fallbackExecution 속성 동작 본문

Tech/Spring

Spring Framework의 @TransactionalEventListener: AFTER_COMMIT과 fallbackExecution 속성 동작

모찌모찝 2026. 10. 16. 10:12

Spring Framework 6.2 기준으로, @TransactionalEventListener는 트랜잭션의 특정 단계에 이벤트 리스너를 바인딩할 수 있는 기능을 제공한다. 기본적으로 이 어노테이션은 트랜잭션이 성공적으로 커밋된 AFTER_COMMIT 단계에 리스너를 실행하도록 설정되어 있다.

AFTER_COMMIT 단계

AFTER_COMMIT는 트랜잭션이 정상적으로 커밋된 이후에 이벤트 리스너가 호출되는 시점을 의미한다. 이 시점에서 트랜잭션은 이미 커밋되었으나, 트랜잭션 관련 리소스는 여전히 활성 상태일 수 있다. 따라서 이 단계에서 데이터 접근 코드를 실행하면 원래 트랜잭션에 참여하지만, 변경 사항은 커밋되지 않는다.

fallbackExecution 속성

기본적으로 @TransactionalEventListener는 활성 트랜잭션 내에서만 이벤트를 처리한다. 만약 이벤트가 트랜잭션 없이 발행되면 리스너는 호출되지 않는다. 그러나 fallbackExecution=true로 설정하면, 트랜잭션이 없을 때도 이벤트를 처리하도록 허용한다. 이 옵션은 트랜잭션 바운드가 아닌 상황에서도 이벤트 처리를 허용해야 할 때 유용하다.

적용 조건 및 주의사항

리액티브 트랜잭션은 스레드 로컬 대신 Reactor 컨텍스트를 사용하므로 트랜잭션 컨텍스트를 발행 이벤트의 소스에 포함해야 합니다. 리스너를 붙였다는 사실만으로 해당 컨텍스트가 자동 전달된다고 가정하면 안 됩니다.

  • 트랜잭션이 진행 중이지 않으면 기본적으로 이벤트는 무시된다.
  • fallbackExecution을 활성화하지 않으면 트랜잭션 외부에서 이벤트가 처리되지 않는다.
  • 트랜잭션 단계로는 BEFORE_COMMIT, AFTER_COMMIT (기본값), AFTER_ROLLBACK, AFTER_COMPLETION이 있다.
  • Spring 6.1부터는 스레드 바운드 트랜잭션(PlatformTransactionManager)뿐 아니라 리액티브 트랜잭션(ReactiveTransactionManager)도 지원한다.

요약하면, @TransactionalEventListener의 AFTER_COMMIT은 트랜잭션 커밋 후 이벤트를 처리하는 시점이며, fallbackExecution은 트랜잭션이 없을 때도 이벤트를 처리할지 여부를 결정하는 속성이다.

참고 자료

Comments