기존 AbstractPlatformTransactionManager
에서의 이벤트 발행
AbstractPlatformTransactionManager
를 사용하는 경우 commit
을 수행하는 과정에서 TransactionSynchronizationUtils
의 메서드를 활용하여 @TransactionalEventListener
에게 이벤트를 전달합니다.
조금 더 구체적으로는 TransactionSynchronizationManager.getSynchronizations()을 통해 해당 트랜잭션에서 등록된 synchronizations을 조회하고 synchronization에 등록된 콜백을 실행하는 방법으로 이벤트를 전달합니다.
ReactiveTransactionManager
에서의 이벤트 발행
하지만 Webflux에서 사용하는 ReactiveTransactionManager
는 AbstractPlatformTransactionManager
이 아닌 TransactionManager
를 확장하고 있기에 기존의 방식으로 이벤트를 전달할 수 없습니다.
ReactiveTransactionManager
에서의 이벤트 발행은 AbstractPlatformTransactionManager
를 사용할 때와 비교하여 조금의 과정이 추가되지만 유사한 방식으로 진행할 수 있습니다.
- 이벤트를 발행하기 전
org.springframework.transaction.reactive.TransactionSynchronizationManager.forCurrentTransaction
을 통해 트랜잭션에서의TransactionSynchronizationManager
를 조회합니다. - 조회한
org.springframework.transaction.reactive.TransactionSynchronizationManager
에 메서드registerSynchronization
를 통해TransactionSynchronization
을 등록합니다.TransactionSynchronization
에서 필요한 상황의 메서드를 오버라이드 합니다.- 오버라이드한 메서드 내부에서 이벤트 퍼블리셔를 통해 이벤트를 발행합니다.
// afterCompletion 경우 예제
TransactionSynchronizationManager.forCurrentTransaction().map { manager ->
manager.registerSynchronization(object : TransactionSynchronization {
override fun afterCompletion(status: Int): Mono<Void> {
applicationEventPublisher.publishEvent(event)
log.info { "published event: $event" }
return super.afterCompletion(status)
}
})
'스프링' 카테고리의 다른 글
MVC의 요청 처리 과정 (0) | 2025.03.31 |
---|---|
인터페이스 타입으로 등록한 빈을 구현체 타입으로 DI 받지 못한 이유 (0) | 2025.03.19 |
트랜잭션을 위한 프록시 객체와 AspectJ의 프록시 객체는 어떤 순서로 실행될까? (0) | 2025.03.18 |
내가 이해한 스프링의 빈 생명 주기 (0) | 2025.03.17 |
트랜잭션 커밋과 AOP 중 어떤 것이 먼저 실행 될까? (0) | 2025.03.15 |