해결된 질문
작성
·
115
·
수정됨
0
안녕하세요 챕터18 강의에 대한 질문 두가지가 있습니다..
retry 관련 yml에 설정을 하였을 경우에는
아래 코드에 자동으로 retryTemplate 이 적용되는 것으로 확인하였는데요..
여기서 스프링이 어떻게 구분을 하고 해당 메서드에 retry를 적용 시키는 건가요? 아니면 큐 이름을 보고 ORDER_COMPLETED_QUEUE에 설정된 .withArgument(데드레터인자) 이 설정값들을 보고 확인 했던 것일까요..?
그리고 @Retryable 해당 어노테이션도 존재하던데 해당 어노테이션은 aop 방식으로 template이 적용되는 것 같은데 이 방법을 사용하여도 똑같이 적용 되는 것일까요.?
@RabbitListener(queues = ORDER_COMPLETED_QUEUE)
public void consume(String message){
if ("fail".equalsIgnoreCase(message)){
System.out.println("retry count: " + ++retryCount);
throw new RuntimeException();
}
System.out.println("Received Message: " + message);
}
답변 2
2
안녕하세요. 수강자님.
retry 설정은 내부적으로 Consumer (@RabbitListener) -> SimpleMessageListenerContainer (RabbitMQ 메시지 수신) -> RetryTemplate (설정된 max-attempts
만큼 재시도)
의 흐름을 탑니다.
- 성공 → 정상 메시지 처리 완료
- 실패 → 재시도 진행
- 최대 재시도 초과 → DLQ 또는 폐기 처리
이런 흐름인데, SimpleMessageListenerContainer 가 생성될 때 메시지를 받을 큐와 리스너가 등록이 됩니다.
@RabbitListener를 사용하면 내부적으로 SimpleMessageListenerContainer가 자동으로 생성되기 때문에 retry 설정을 읽어서 exception 이 발생할 경우 RetryTemplate을 사용해서 자동으로 설정된 속성에 해당하는 작업을 수행하게 됩니다.
두번째 질문은 Spring 프레임워크에서 제공하는 Retry 기능입니다. 동작방식은 RabbitListener의 retry와는 다르지만, 동일한 기능을 제공합니다. (즉, 설정된 조건에 따라 예외가 발생하면 특정 횟수만큼 자동으로 재시도를 합니다)
내부적으로는 Spring AOP와 프록시를 기반으로 메서드 단위에서 동작하고, RetryableInterceptor 를 사용하므로 호출 구조는 @RabbitListener로 설정해서 메시지 소비 단위로 처리하는 SimpleMessageListenerContainer 와는 다르므로 아래의 아티클을 읽어보시기 바랍니다.
(https://hseong.tistory.com/89 와 https://codesnapmag.hashnode.dev/spring-retryable-annotation 를 참고)
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. hoonseung님.
질문해주신 챕터18의 retry 설정에 관한 사항을 설명해 드리겠습니다.
Spring과 Retry Template의 연관:
@RabbitListener
어노테이션을 통해 메시지를 수신할 수 있습니다. 이 때 메시지 소비가 실패하면 메서드를 자동으로 재시도할 수 있도록 하는 것이 Retry 기능입니다.@Retryable 어노테이션:
@Retryable
은 Spring에서 지원하는 어노테이션으로, 주로 AOP 방식을 통해 메서드를 자동으로 재시도하도록 구성할 수 있습니다. @RabbitListener
와 함께 사용할 수 있으며, 이는 특정 조건하에 실패 시 메서드를 재시도할 수 있도록 Spring 재시도 템플릿과 연계되어 동작합니다.이와 같이 Spring의 Retry 기능은 설정과 어노테이션을 통해 자동화된 재시도를 가능하게 해줍니다.
아래의 질문들과 관련된 유사한 문제 및 해결 방법에 대해 이해를 심화할 수 있는 링크를 참고하시기 바랍니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.