관리자 페이지를 구현하면서 회원가입이나, 회원탈퇴등 특정 이벤트마다 메일 템플릿을 구현하여 발송하는 작업을 해야했다.
이를 어떻게 처리할까 하다가 우선 AOP가 생각나서 검색을 했는데 이벤트 방식으로 처리가 가능하다는것을 알게 되었다.
TransactionalEventListener과 Async를 동시에 사용하면 특정 이벤트의 트랜잭션이 커밋되고 난 후에 비동기 작업을 처리할 수 있다고 한다.
즉 현재 내가 필요한 작업은 회원가입 -> 축하 메일 발송이다.
메일 발송이 실패해도 회원가입은 롤백이 되면 안된다.. 매우 큰일난다!!
다음과 같이 구현하여 이를 해결하였다.
@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, classes = UserRegisteredEvent.class)
해당 코드를 보면 phase TransactionPhase.AFTER_COMMIT이 있다. 즉 트랜잭션이 종료된 시점에 작동하므로 회원가입에 영향을 끼치지 않고 메일을 발송할 수 있다.
회사 보다 사이드프로젝트를 하며 더 성장하는것 같다~