사용자 도구

사이트 도구


springframework:transaction:transactional_event_listener

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
springframework:transaction:transactional_event_listener [2019/03/26 18:49]
kwon37xi [참조]
springframework:transaction:transactional_event_listener [2024/04/30 15:00] (현재)
kwon37xi [주의 사항]
줄 5: 줄 5:
   * 트랜잭션이 관련 있을 경우에는 ''@EventListener''가 아니라 ''@TransactionalEventListener''를 사용해야 한다. ''@EventListener'' 는 트랜잭션 범위 내에서 동기적으로 실행되고, ''@TransactionalEventListener''는 커밋 전/후 등을 자유롭게 지정할 수 있다.   * 트랜잭션이 관련 있을 경우에는 ''@EventListener''가 아니라 ''@TransactionalEventListener''를 사용해야 한다. ''@EventListener'' 는 트랜잭션 범위 내에서 동기적으로 실행되고, ''@TransactionalEventListener''는 커밋 전/후 등을 자유롭게 지정할 수 있다.
  
-====== HowTo ======+===== HowTo =====
   * 트랜잭션 범위 내에서 ''ApplicationEventPublisher'' 를 사용해서 아무 이벤트 객체나 이벤트로 발행   * 트랜잭션 범위 내에서 ''ApplicationEventPublisher'' 를 사용해서 아무 이벤트 객체나 이벤트로 발행
   * ''@TransactionalEventListner'' 애노테이션이 걸린 메소그의 인자로 해당 이벤트 객체를 받아서 처리.   * ''@TransactionalEventListner'' 애노테이션이 걸린 메소그의 인자로 해당 이벤트 객체를 받아서 처리.
   * ''@TransactionalEventListner'' 의 설정에 따라서 이벤트 핸들러 호출이 커밋 전,후 등에 됨을 보장받을 수 있음.   * ''@TransactionalEventListner'' 의 설정에 따라서 이벤트 핸들러 호출이 커밋 전,후 등에 됨을 보장받을 수 있음.
 +  * 트랜잭션이 없다면 작동하지 않는다. 단, ''fallbackExecution''가 설정돼 있으면 작동한다.
 +  * event handler 메소드에 ''@Async''를 걸면 비동기로 실행할 수 있다. [[springframework:async|Spring @Async]]
  
-====== 참조 ======+===== 주의 사항 ===== 
 +  * **이벤트를 publish 했더라도 트랜잭션이 없으면 아무것도 실행 안 된다.** 
 +    * 이때 ''fallbackExecution=true'' 로 지정하면 트랜잭션이 아예 없는 상황에서도 실행은 된다. 
 +  * **''AFTER_COMMIT'' phase 에서 JPA Entity에 수정을 가해봐야 반영이 안 된다.** 이미 커밋한 상태이고 트랜잭션자체는 기존 것을 유지하고 있다. 기존 JPA Entity 뿐만 아니라 신규 트랜잭션도 실행되지 않는다. 
 +  * ''@Async''를 걸지 않으면 이벤트 처리를 마칠 때 까지 DB 커넥션을 놓치 않게 된다. 따라서 ''@Async'' 로 빨리 응답을 주고 기존 DB 커넥션도 반환하는게 보통을 더 좋을 것으로 보인다. 
 +  * ''BEFORE_COMMIT'' phase 에서 뭔가를 할 때는 ''@Async''를 사용하지 말 것. 
 + 
 +===== 참조 =====
   * [[https://dzone.com/articles/transaction-synchronization-and-spring-application|Transaction Synchronization and Spring Application Events: Understanding @TransactionalEventListener]] 제일 잘 설명된 문서.   * [[https://dzone.com/articles/transaction-synchronization-and-spring-application|Transaction Synchronization and Spring Application Events: Understanding @TransactionalEventListener]] 제일 잘 설명된 문서.
 +  * [[http://pillopl.github.io/reliable-domain-events/|Reliable Domain Events – pilo – Software Developer]]
   * [[https://blog.pragmatists.com/spring-events-and-transactions-be-cautious-bdb64cb49a95|Spring events and transactions — be cautious! – Pragmatists]]   * [[https://blog.pragmatists.com/spring-events-and-transactions-be-cautious-bdb64cb49a95|Spring events and transactions — be cautious! – Pragmatists]]
   * [[http://bartslota.blogspot.com/2017/07/transaction-synchronization-and-spring-events.html|Java And More: Transaction synchronization and Spring application events - understanding @TransactionalEventListener]]   * [[http://bartslota.blogspot.com/2017/07/transaction-synchronization-and-spring-events.html|Java And More: Transaction synchronization and Spring application events - understanding @TransactionalEventListener]]
springframework/transaction/transactional_event_listener.1553593744.txt.gz · 마지막으로 수정됨: 2019/03/26 18:49 저자 kwon37xi