@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void postEvent (PostEvent postEvent) {
log.info("postEvent");
service.shorteningUrl(postEvent.getUid());
}
다음과 같이 이벤트 리스너 생성 후, 해당 이벤트가 발행되는 경우에 제대로 단축 url 생성이 되지 않는 이슈가 발생했다. 처음에는 단축 url 생성하는 로직 자체에서 문제가 있는 줄 알았으나, 테스트 결과 정상적으로 생성되는 것을 확인.
@Async("asyncThreadExecutor")
@Transactional
public void shorteningUrl(String uid) {
String shortenedUrl = "{shorten url}"
recruitment.setShortenedUrl(shortenedUrl);
recruitmentRepository.save(recruitment);
}
문제는 다음과 같았다.
단축 url 생성하는 shorteningUrl 메소드가 @async를 사용하여 별도의 쓰레드에서 실행되는데 이 경우 트랜잭션 범위 밖으로 벗어난 것이다.
당연하지만, @Async 를 사용하는 경우, 기존 메소드에서 사용하던 트랜잭션 컨텍스트에 참가가 불가능하다. 따라서 별도의
@Transactional(propagation = Propagation.REQUIRES_NEW)
를 사용해서 해결해줄 수 있었다.
@Async("asyncThreadExecutor")
@Transactional(value = Transactional.TxType.REQUIRES_NEW)
public void shorteningUrl(String uid) {
String shortenedUrl = "{shorten url}"
recruitment.setShortenedUrl(shortenedUrl);
recruitmentRepository.save(recruitment);
}