Inflearn brand logo image

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

HAHA님의 프로필 이미지
HAHA

작성한 질문수

은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스

Kafka Component 및 메시지 유실 유무

CompletableFuture 질문

해결된 질문

작성

·

46

0

안녕하세요.

KafkaProducer future.whenComplete에서

throw 하는 코드를 보고 질문 드립니다.

코드를 보니까 CompletableFuture로 구현되어 있던데

transactional.run 안에서 예외를 잡을 수가 있는지 궁금합니다.

코드만 보기로는 whenComplete가 비동기로 동작해서 저기서 예외를 던진다고 누가 받는지 잘 모르겠습니다.

제가 스프링 비동기를 구현해보지 않아서 질문드립니다.

감사합니다.

답변 3

1

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

이 부분에 대해서는 스레드와의 관계를 아셔야합니다.

결론은 잡지 못합니다.

 

왜냐하면 별도의 작업으로 진행이 되기 때문입니다.

예를들어서 A라는 스레드가 run을 호출하여 처리를 하는데 내부적으로 B라는 스레드가 동작하는(kafka) 방식이기 때문에 다른 쓰레드로 인식하며 해당 에러를 받을 수가 없어요.

 

또한 run이 마무리가 되고나서 throw가 처리되었는지도 알수가 없는 상황이 유발가능합니다.

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

제 기억이 잘못되었을 수도 있지만, 저 질문을 남긴 시점 강의에서

produce를 했을 때 complete에서 예외를 발생시킨다면 트랜잭션 작업을 롤백시킨다.

같은 설명이 있었던 기억이 있습니다.

(제가 설명 의도를 잘못 이해했을수도 있습니다!)

그래서 확인차 질문드렸습니다.

 

감사합니다.

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

한번 확인해보도록 하겠습니다. 감사합니다!

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

아하 확인해보니 외부 코드를 수정하다보니 해당 부분에 대한 코드 수정은 빠져있군요 동기적 표현을 위해서는 내부적으로 get으로 변경해주시면 됩니다. 예를들면 이런 코드가 되겠네요.

 

try {
    template.send(topic, message).get()
    log.info("메시지 발행 성공 - topic: $topic - time: ${LocalDateTime.now()}")
} catch (ex: Exception) {
    throw CustomException(ErrorCode.FAILED_TO_SEND_MESSAGE, topic)
}

1

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

안녕하세요!! 금일 밤에 한번 확인하고 추가로 답변 추가해두도록 하겠습니다!! 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. HAHA님.

KafkaProducer의 CompletableFuture와 비동기 예외 처리에 관한 질문을 주셨군요. CompletableFuture는 비동기 작업을 처리하고 후속 작업을 정의하는 데 유용한 Java 클래스입니다. 질문해주신 내용을 다루는 유사한 질문 및 답변을 찾아보았습니다.

  1. CompletableFuture의 예외 처리:

    • CompletableFuture에서 whenComplete를 통해 후속 작업을 정의할 수 있습니다. 이 때, 비동기적으로 발생한 예외를 처리하기 위해 exceptionally, handle, 또는 whenComplete와 같이 지정된 함수에서 예외를 잡을 수 있습니다.
    • CompletableFuture 예외 처리: 예외는 후속 체인의 한 부분에서 처리되기 때문에 트랜잭션 경계 또는 CompletableFuture 내에서 정상적으로 예외를 잡기만 하면 됩니다.
  2. 트랜잭션 내 예외 처리:

    • transactional.run 안에서 예외를 잡을 수 있는지는 트랜잭션의 범위와 예외 처리 전략에 달려 있습니다. 보통 스프링의 @Transactional 어노테이션이 적용된 메소드나 블록의 예외는 자동으로 롤백되지만, 비동기 예외는 별도로 처리해줘야 합니다.
    • 트랜잭션 및 비동기 예외 처리 전략: CompletableFuture 안에서 발생한 예외는 전통적인 스프링 예외 처리 방식과 약간의 차이가 있을 수 있습니다. 호출하는 지점에서 예외를 포착하거나 자체 예외 처리기를 사용해야 합니다.

이처럼 CompletableFuture를 활용하여 비동기 작업을 구현할 때, 어떤 부분에서 예외를 처리할지 잘 설계하는 것이 중요합니다. 비동기 환경에서는 예외가 즉각적으로 처리되지 않으므로, 예외 처리 로직을 명확히 하시는 것이 필요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

HAHA님의 프로필 이미지
HAHA

작성한 질문수

질문하기