Inflearn Community Q&A
@Async 여부의 차이가 궁금합니다.
Resolved
Written on
·
165
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를 붙히지 않았더라도 메인 로직에서 끝마치고 해당 이벤트를 실행하니깐 똑같은 결과가 나오지 않나요?
차이가 궁금합니다!
Quiz
트랜잭션의 ACID 속성 중, 트랜잭션 내의 모든 작업이 성공적으로 완료되거나, 실패 시에는 모든 변경 사항이 취소되어 트랜잭션 시작 전의 상태로 되돌아가는 특성을 무엇이라고 할까요?
일관성 (Consistency)
지속성 (Durability)
원자성 (Atomicity)
격리성 (Isolation)
Answer 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)이벤트 수행 후 쓰레드 반환
맞나용?




