@EventListener
가 아니라 @TransactionalEventListener
를 사용해야 한다. @EventListener
는 트랜잭션 범위 내에서 동기적으로 실행되고, @TransactionalEventListener
는 커밋 전/후 등을 자유롭게 지정할 수 있다.ApplicationEventPublisher
를 사용해서 아무 이벤트 객체나 이벤트로 발행@TransactionalEventListner
애노테이션이 걸린 메소그의 인자로 해당 이벤트 객체를 받아서 처리.@TransactionalEventListner
의 설정에 따라서 이벤트 핸들러 호출이 커밋 전,후 등에 됨을 보장받을 수 있음.fallbackExecution
가 설정돼 있으면 작동한다.@Async
를 걸면 비동기로 실행할 수 있다. Spring @AsyncfallbackExecution=true
로 지정하면 트랜잭션이 아예 없는 상황에서도 실행은 된다.AFTER_COMMIT
phase 에서 JPA Entity에 수정을 가해봐야 반영이 안 된다. 이미 커밋한 상태이고 트랜잭션자체는 기존 것을 유지하고 있다. 기존 JPA Entity 뿐만 아니라 신규 트랜잭션도 실행되지 않는다.@Async
를 걸지 않으면 이벤트 처리를 마칠 때 까지 DB 커넥션을 놓치 않게 된다. 따라서 @Async
로 빨리 응답을 주고 기존 DB 커넥션도 반환하는게 보통을 더 좋을 것으로 보인다.BEFORE_COMMIT
phase 에서 뭔가를 할 때는 @Async
를 사용하지 말 것.