@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);
    }