해결된 질문
작성
·
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님, 좋은 질문 감사합니다!
맞습니다! 민우님이 스스로 찾으신 답변이 정확합니다!!
@Async 없이 @TransactionalEventListener만 사용
클라이언트 → (쓰레드 A) 메인로직 수행 → (쓰레드 A) 이벤트 처리 → (쓰레드 A 반환) 클라이언트에게 응답
문제점: 카카오톡 API 호출이 2초 걸린다면, 사용자는 이벤트 참가 후 2초를 더 기다려야 함
실제 응답 시간: 메인 로직 + 알림 발송 시간
@Async와 @TransactionalEventListener 함께 사용
클라이언트 → (쓰레드 A) 메인로직 수행 → (쓰레드 A 반환) 클라이언트에게 즉시 응답 → (쓰레드 B) 이벤트 처리
장점: 사용자는 이벤트 참가 완료 후 즉시 응답을 받음
실제 응답 시간: 메인 로직 시간만
실무에서는 이런 부분도 고려해야 해보시는 걸 추천드립니다!
비동기 처리 실패 시 재시도 로직
스레드 풀 설정 (기본 SimpleAsyncTaskExecutor는 위험)
알림 발송 실패에 대한 모니터링
이런 경험을 쌓아서 이력서에 써보시는 걸 추천드리빈다!! 항상 좋은 질문 감사드립니다!
좋은 주말 보내세요~~~
0
찾아보니
@Async를 사용하지 않은 경우
클라이언트 -> (쓰레드 A)메인로직 수행-> (쓰레드 A)이벤트 수행 -> (쓰레드 A 반환) 클라이언트에게 응답
@Async를 사용한 경우
클라이언트 -> (쓰레드 A)메인로직 수행-> (쓰레드 A 반환) 클라이언트에게 응답 -> (쓰레드 B)이벤트 수행 후 쓰레드 반환
맞나용?