Inflearn brand logo image

인프런 커뮤니티 질문&답변

kongminoo님의 프로필 이미지
kongminoo

작성한 질문수

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

4-13. 실제 예시 코드로 작성하기 - 2

@Async 여부의 차이가 궁금합니다.

해결된 질문

작성

·

80

0

@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleEventJoinCompleted(EventJoinCompletedEvent event) {
    try {
        kakaoTalkMessageApi.sendEventJoinMessage(
                event.getPhoneNumber(),
                event.getEventName()
        );
    } catch (Exception e) {
        log.error("알림 발송 실패. eventId={}, eventName={}",
                event.getEventId(),
                event.getEventName(),
                e);
    }
}

이 로직은 비동기적으로 이벤트를 처리하는 알림서비스 로직입니다.

@TransactionalEventListner(Aftercommit)를 사용하면 메인 로직이 commit 된 이후에 해당 이벤트가 실행하는 걸로 알고있는데

@Asnyc를 붙히지 않았더라도 메인 로직에서 끝마치고 해당 이벤트를 실행하니깐 똑같은 결과가 나오지 않나요?

차이가 궁금합니다!

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 kongminoo님, 좋은 질문 감사합니다!

맞습니다! 민우님이 스스로 찾으신 답변이 정확합니다!!

  1. @Async 없이 @TransactionalEventListener만 사용

  • 클라이언트 → (쓰레드 A) 메인로직 수행 → (쓰레드 A) 이벤트 처리 → (쓰레드 A 반환) 클라이언트에게 응답

  • 문제점: 카카오톡 API 호출이 2초 걸린다면, 사용자는 이벤트 참가 후 2초를 더 기다려야 함

  • 실제 응답 시간: 메인 로직 + 알림 발송 시간

  1. @Async와 @TransactionalEventListener 함께 사용

  • 클라이언트 → (쓰레드 A) 메인로직 수행 → (쓰레드 A 반환) 클라이언트에게 즉시 응답 → (쓰레드 B) 이벤트 처리

  • 장점: 사용자는 이벤트 참가 완료 후 즉시 응답을 받음

  • 실제 응답 시간: 메인 로직 시간만

실무에서는 이런 부분도 고려해야 해보시는 걸 추천드립니다!

  • 비동기 처리 실패 시 재시도 로직

  • 스레드 풀 설정 (기본 SimpleAsyncTaskExecutor는 위험)

  • 알림 발송 실패에 대한 모니터링

이런 경험을 쌓아서 이력서에 써보시는 걸 추천드리빈다!! 항상 좋은 질문 감사드립니다!

좋은 주말 보내세요~~~

0

kongminoo님의 프로필 이미지
kongminoo
질문자

찾아보니


@Async를 사용하지 않은 경우

클라이언트 -> (쓰레드 A)메인로직 수행-> (쓰레드 A)이벤트 수행 -> (쓰레드 A 반환) 클라이언트에게 응답


@Async를 사용한 경우

클라이언트 -> (쓰레드 A)메인로직 수행-> (쓰레드 A 반환) 클라이언트에게 응답 -> (쓰레드 B)이벤트 수행 후 쓰레드 반환

맞나용?

kongminoo님의 프로필 이미지
kongminoo

작성한 질문수

질문하기