반응형
개요
Event 기반 구조로 개발을 할 때 가용할만한 기능
@EventListener
- Spring에서 제공하는 EventListener
- 이벤트를 publish하고, @EventListener 가 달린 메소드에서 자신의 condition에 맞는 이벤트일 시 수행한다.
@TransactionalEventListener
- 기본적으로 event를 publishing하면 비동기로 이벤트가 발행된다.
- 주요 로직에서 이벤트 발행 후 오류가 발견되어 rollback이 필요할 시 이미 발행된 Event에 대해서는 rollback이 불가하다.
- 따라서 Transaction이 필요한 로직에서는 Event가 발행되지 않거나 실행이 안되어야한다.
원리
- @Transaction에 종속적인 eventListener이다.
- 이벤트를 발행하는 주체의 Transaction 정보를 가져와서 성공한 경우에만 이벤트를 처리한다.
성공.log
2021-08-22 22:34:28.268 INFO 13835 --- [ Test worker] c.p.a.api.game.service.EventTestService : 메서드 시작
2021-08-22 22:34:28.355 INFO 13835 --- [ Test worker] c.p.a.api.game.service.EventTestService : reviewRepositoryV1 저장
2021-08-22 22:34:28.356 INFO 13835 --- [ Test worker] c.p.a.api.game.service.EventTestService : 이벤트 발생 요청
2021-08-22 22:34:28.359 INFO 13835 --- [ Test worker] c.p.a.api.game.service.EventTestService : userRepositoryV1 저장
2021-08-22 22:34:28.359 INFO 13835 --- [ Test worker] c.p.a.api.game.service.EventTestService : 메서드 종료
2021-08-22 22:34:28.378 INFO 13835 --- [ Test worker] p.a.a.g.s.TransactionalEventTestListener : TransactionalEventListener 이벤트 마무리
실패.log
2021-08-22 22:36:15.959 INFO 13944 --- [ Test worker] c.p.a.api.game.service.EventTestService : 메서드 시작
2021-08-22 22:36:16.048 INFO 13944 --- [ Test worker] c.p.a.api.game.service.EventTestService : reviewRepositoryV1 저장
2021-08-22 22:36:16.049 INFO 13944 --- [ Test worker] c.p.a.api.game.service.EventTestService : 이벤트 발생 요청
2021-08-22 22:36:16.050 INFO 13944 --- [ Test worker] c.p.a.api.game.service.EventTestService : 에러 발생
java.lang.RuntimeException: exception
// @Transaction에 종속적이기 때문에, 발행하는 주체가 Transaction이 없는 경우 실행되지 않음
옵션
- AFTER_COMMIT (기본값) - 트랜잭션이 성공적으로 마무리(commit)됬을 때 이벤트 실행
- AFTER_ROLLBACK – 트랜잭션이 rollback 됬을 때 이벤트 실행
- AFTER_COMPLETION – 트랜잭션이 마무리 됬을 때(commit or rollback) 이벤트 실행
- BEFORE_COMMIT - 트랜잭션의 커밋 전에 이벤트 실행
Reference
- https://sabarada.tistory.com/188
반응형
'개발 일지' 카테고리의 다른 글
자동화 공격이란 (0) | 2022.11.25 |
---|---|
DID 란 (0) | 2022.11.25 |
Spring boot With Embedded Tomcat (0) | 2022.11.23 |
MDC 란 (0) | 2022.11.23 |
QuerydslPredicate 란 (0) | 2022.11.23 |