Loading...
Spring Framework Reference Documentation 7.0.2의 Transaction-bound Events의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Spring 4.2부터 이벤트의 리스너는 트랜잭션의 phase에 bound될 수 있습니다. 일반적인 예시는 트랜잭션이 성공적으로 완료되었을 때 이벤트를 처리하는 것입니다.
이렇게 하면 현재 트랜잭션의 결과가 리스너에게 실제로 중요할 때 이벤트를 더 유연하게 사용할 수 있습니다.
@EventListener 어노테이션을 사용해서 일반적인 이벤트 리스너를 등록할 수 있습니다.
이를 트랜잭션에 bound해야 한다면 @TransactionalEventListener를 사용하십시오.
이렇게 하면 리스너는 기본적으로 트랜잭션의 커밋 phase에 bound됩니다.
다음 예시는 이 개념을 보여줍니다. 어떤 컴포넌트가 order-created 이벤트를 publish하고, 우리가 그 이벤트가 publish된 트랜잭션이 성공적으로 커밋된 후에만 해당 이벤트를 처리해야 하는 리스너를 정의하고 싶다고 가정해 봅시다.
다음 예시는 그와 같은 이벤트 리스너를 설정합니다:
1@Component 2public class MyComponent { 3 4 @TransactionalEventListener 5 public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) { 6 // ... 7 } 8}
1@Component 2class MyComponent { 3 4 @TransactionalEventListener 5 fun handleOrderCreatedEvent(creationEvent: CreationEvent<Order>) { 6 // ... 7 } 8}
@TransactionalEventListener 어노테이션은 리스너가 bound되어야 하는 트랜잭션의
phase를 커스터마이즈할 수 있게 해주는 phase attribute를 제공합니다.
유효한 phase는 BEFORE_COMMIT, AFTER_COMMIT(기본값), AFTER_ROLLBACK뿐 아니라
트랜잭션 completion(롤백이든 커밋이든)을 통합하는 AFTER_COMPLETION입니다.
어떤 트랜잭션도 실행 중이 아니면, 요구되는 시맨틱스를 만족시킬 수 없으므로 리스너는 전혀 호출되지 않습니다.
그러나 어노테이션의 fallbackExecution
attribute를 true로 설정하여 그 동작을 override할 수 있습니다.
6.1부터
@TransactionalEventListener는PlatformTransactionManager가 관리하는 thread-bound 트랜잭션뿐 아니라<br>ReactiveTransactionManager가 관리하는 리액티브 트랜잭션과도 함께 동작할 수 있습니다.<br>전자의 경우 리스너는 현재 thread-bound 트랜잭션을 볼 수 있음이 보장됩니다.<br>후자는 thread-local 변수가 아니라 Reactor 컨텍스트를 사용하므로, 트랜잭션<br>컨텍스트가 published 이벤트 인스턴스의 이벤트 소스로 포함되어야 합니다.<br>자세한 내용은<br>TransactionalEventPublisher<br>javadoc을 참고하십시오.
Choosing Between Programmatic and Declarative Transaction Management
Application server-specific integration