인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

ckstj8027님의 프로필 이미지

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

ErrorDecoder를 이용한 예외 처리

FeignErrorDecoder 질문

작성

·

50

·

수정됨

0

FeignErrorDecoder 에 대해서

order_is_empty를 수정한뒤에

127.0.0.1:8000/actuator/busrefresh 를 호출하면

Keys refreshed [spring.cloud.bootstrap.enabled, order_service.exception.order_is_empty]

로그는 정상적으로 뜨며

디버깅 모드로 코드를 추가해서 실행한결과

List<ResponseOrder> orders= orderServiceClient.getOrders(userId);

코드전에

env.getProperty("order_service.exception.order_is_empty") 를 확인해본 결과는

정상적으로 리프레시되지만 이후에 오류를 터트리고 FeignErrorDecoder 처리 로직에서

switch(response.status()){
    case 400:
        break;

    case 404:
        if(methodKey.contains("getOrders")){

            return new ResponseStatusException(HttpStatus.valueOf(response.status()),env.getProperty("order_service.exception.order_is_empty"));
       

        }
        break;


    default:
        return new Exception(response.reason());

}

getProperty("order_service.exception.order_is_empty")

이부분이 새로운 환경 변수가

ErrorDecoder 에서는 반영 안되는것같아서 해결이 안되서 질문남깁니다 !

UserServiceImpl 에서는 정상적으로 바뀐값이 나오는거보면 ErrorDecoder 문제 같은데 정확히 모르겠습니다

@RefreshScope 이것도 해결책은 아닌것같아요

답변 부탁드립니다 !


 

 

 

 

답변 2

0

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

안녕하세요, 이도원입니다.

오류메시지가 공유되지 않아서 정확한 원인은 모르겠지만, 단순하게 문의하신 만으로는 FeginErrorDecoder에 대한 오류 또는 UserService에서의 order_service.excpetion.order_is_empty 메시지에 대한 오류 중에 한가지가 아닌가 싶습니다.

디버깅 하실 때, FeginErrorDecoder의 decode 부분에서 어디가 어떤 상태인지 확인해 보면서, order-service가 준비 되지 않아서 생기는 오류인지, 아니면, 말씀하신 것처럼 환경 변수 값에 대한 주입이 되지 않아서, 반영이 잘못 된 부분인지 확인이 필요할 것 같습니다. 예를 들어, 초기 값으로는 잘 설정되어 표시되지만, spring cloud bus에 의해서 refresh 된 데이터는 반영이 안되는 문제인지 등.. 그런경우라면 apigateway-service처럼 다른 서비스에서의 환경 변수 값들은 잘 변경되는지 등을 확인해 볼 수 있을 것 같습니다. 우선 아래 내용을 확인해 주시거나, 다시 글 남겨주시면 저희도 다시한번 찾아 보도록 하겠습니다.

  • 오류의 정확한 메세지. (호출 했을 때 + 콘솔 로그 포함)

  • 다른 서비스들에서의 환경 변수가 잘 변경되는지

  • spring cloud bus에서 변경이 적용되기 전에는 정상적으로 출력되는지

위 내용을 확인해 보시면 좋을 것 같습니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

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

ckstj8027님이 질문하신 FeignErrorDecoder 의 변경 사항이 busrefresh 를 통해 반영되지 않는 문제를 해결하기 위한 몇 가지 검토 사항을 제안드리겠습니다.

  1. 캐시 문제: FeignErrorDecoder는 컨텍스트가 초기화될 때 바인딩되기 때문에, 변경된 설정이 반영되기 위해서는 애플리케이션의 재시작이 필요할 수 있습니다. @RefreshScope를 사용해도 잘 반영되지 않는 경우가 있으며, 이 경우 @RefreshScope가 붙어 있는지 확인해 주세요.

  2. 어노테이션 사용 확인: @RefreshScope 어노테이션이 FeignErrorDecoder가 포함된 클래스, 혹은 해당 설정을 사용하는 Bean에 적용되어 있는지 확인해 보세요. 이 어노테이션은 해당 Bean이 변경된 설정을 실시간으로 반영할 수 있도록 도와줍니다.

  3. 설정 우선 순위 검토: application.properties 또는 bootstrap.properties의 설정 중 다른 설정이 우선하는 것일 수 있습니다. 설정 파일의 우선순위를 확인해 본 후 문제가 되는 설정이 어디서 오고 있는지 확인해 보셔야 합니다.

  4. 로그 확인: 컨텍스트 재생성 시 로그를 통해 설정이 제대로 로드되는지 확인해 주세요. application.properties 혹은 bootstrap.properties에서 잘못된 경로나 오타가 있을 수도 있습니다.

  5. spring-cloud 버전 확인: 사용 중인 Spring Cloud 버전에 따라 특정 로직이 정상적으로 동작하지 않는 경우가 있습니다. 최신 버전으로 업데이트하여 동일 문제가 발생하는지 확인이 필요할 수 있습니다.

유사한 문제에 대한 질문과 답변은 아래 링크에서 확인할 수 있습니다:

이 답변이 문제 해결에 도움이 되었으면 좋겠습니다. 추가적으로 궁금한 점이 있으시면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏