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

이지수님의 프로필 이미지
이지수

작성한 질문수

생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현

Spring Cloud OpenFeign (2)

5:23분 테스트 결과 관련 문의드립니다.

작성

·

41

·

수정됨

0

강사님 안녕하세요 :)

우선 양질의 강의 감사드립니다.

 

==========

 

 1. 문제 사항

에러 메시지 내 정보가 강의 내용과 다르게 반환되는 문제가 발생합니다. 404 -> 500

@FeignClient(url = "http://localhost:8080", name = "helloClient")
public interface HelloClient {

    @GetMapping(value = "/api/health2", consumes = "application/json")
    HealthCheckResponse healthCheck();
}

 

{

    "errorCode": "500 INTERNAL_SERVER_ERROR",

    "errorMessage": "[500] during [GET] to [http://localhost:8080/api/health2] [HelloClient#healthCheck()]: [{\"errorCode\":\"500 INTERNAL_SERVER_ERROR\",\"errorMessage\":\"No static resource api/health2.\"}]"

}

 

==========

 

2. 문제 파악

전역 예외 처리 코드와 에러 디코더 코드에 디버깅 포인트를 걸고 확인한 결과, 전역 예외처리 코드가 먼저 실행되어 에러 디코더로 넘어가는 시점에는 이미 500 에러가 반환되는 것 같습니다.

 

 

 

이에 전역 예외 코드를 주석처리하고 재실행하면,

에러 디코더에서 404 에러가 반환되는 점까지는 확인했습니다.

 

 

==========

 

해당 문제 외 다른 테스트 결과는 모두 강의 내용과 동일합니다. 혹 제가 놓치고 있는 부분이 어떤 부분일지요? 방법이나 키워드 말씀 주시면 참고하겠습니다.

더불어 @ExceptionHandler와 ErrorDecoder를 동시에 사용할 경우, 구체적으로 설정한 ErrorDecoder의 예외 처리 이후에 전역 예외 처리가 실행되는 흐름일지요? 두 기능을 함께 사용할 때 예외 처리의 흐름 간략히 설명해주시면 학습에 참고하겠습니다. :)

 

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class HealthFeignTestController {

    private final HelloClient helloClient;

    @GetMapping("/health/feign-test")
    public ResponseEntity<HealthCheckResponse> healthCheckTest() {
        HealthCheckResponse healthCheckResponse = helloClient.healthCheck();
        return ResponseEntity.ok(healthCheckResponse);
    }
}

 

@Configuration
@EnableFeignClients(basePackages = "com.app")
@Import(FeignClientsConfiguration.class)
public class FeignConfiguration {

    @Bean
    public ErrorDecoder errorDecoder() {
        return new FeignClientExceptionErrorDecoder();
    }

    @Bean
    public Retryer retryer() {
        return new Retryer.Default(1000, 2000, 3);
    }
}

 

답변 3

0

구파고님의 프로필 이미지
구파고
지식공유자

스프링부트 버전이 올라가면서 없는 API를 호출할 경우 NoResoucrFoundException 예외를 발생시키도록 바뀐거 같습니다. NoResoucrFoundException을 따로 ExceptionHandler로 처리 해주고 있지 않아서 Exception을 처리하는곳에서 처리가 됐습니다. GlobalExceptionHanlder에 아래 예외를 추가해주면 404로 오류를 반환할 것 입니다.

@ExceptionHandler(NoResourceFoundException.class)
protected ResponseEntity<ErrorResponse> handleNoResourceFoundException(NoResourceFoundException e) {
    log.error("NoResourceFoundException", e);
    ErrorResponse errorResponse = ErrorResponse.of(NOT_FOUND.toString(), "Requested resource not found.");
    return ResponseEntity.status(NOT_FOUND).body(errorResponse);
}

 

그리고 ExceptionHandler가 먼저 수행되는건 서버 자기 자신한테 요청하기 때문에 자신한테 없는 API이기 때문에 GlobalExceptionHandler에서 먼저 처리를 하고, FeignClientExceptionErrorDecoder 에서는 에러 응답을 받은 후 처리하기 때문에 2번째로 처리가 됐습니다.

 8081 서버를 하나 더 띄우고

image.png

8081 서버로 /api/health2 를 요청한다면 8080서버에서는 ExceptionHandler에서 오류 처리를 안하고, FeignClientExceptionErrorDecoder에서만 에러를 처리합니다. 8081 서버는 GlobalExceptionHandler에서 오류 로그를 남기고 반환할 오류 응답을 만들 것 입니다.

image.png

 

0

구파고님의 프로필 이미지
구파고
지식공유자

안녕하세요 지수님! 강의 잘 듣고 계시 감사합니다!

혹시 깃허브링크를 남겨주실 수 있으실까요?

 

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

강사님 안녕하세요, 해당 부분 코드 업로드한 깃허브 주소 전달드립니다. 감사합니다! :)

https://github.com/jisulee-shsf/spring-api-app2/commit/b686cc8d1594e604400fb05bde0d9dec00f91cc6

0

안녕하세요, 인프런 AI 인턴입니다. 이지수님!

우선 강의를 수강해 주셔서 감사드립니다. 문의하신 부분에 대해 몇 가지 확인해볼 수 있는 사항을 안내드리겠습니다.

발생하는 에러와 관련된 내용:

  1. 에러 반환 상태 코드: 질문하신 내용에 따르면 404 상태 코드를 기대할 수 있는 상황에서 500 상태 코드가 반환됩니다. 이는 주로 잘못된 URL 또는 요청 처리 과정에서의 예외가 제대로 처리되지 않을 때 발생할 수 있습니다.

  2. 글로벌 예외 처리: 전역 예외 처리 코드가 먼저 실행되면서 원하는 예외 핸들링이 방해받을 수 있습니다. 따라서 전역 예외 처리 코드가 실제로 어떻게 동작하는지, 특정 예외를 어떻게 핸들링하도록 설정되어 있는지를 확인해 보세요.

해결 방법:

  1. API 엔드포인트 확인:

    • HelloClient 인터페이스의 @GetMapping(value = "/api/health2") 부분에서 리소스가 실제로 존재하는지 확인이 필요합니다.
    • 실제 서버에서 실행했을 때 해당 경로가 유효한지, 그리고 이 경로와 매핑된 메소드가 올바르게 호출되는지 점검하세요.
  2. Feign Client 설정:

    • @FeignClient에서 사용하는 URL이 올바른지 다시 한 번 확인해 보세요. 로컬 서버가 실제로 http://localhost:8080/api/health2에 대해 응답을 제공하고 있는지를 테스트해 보시는 것이 좋습니다.
  3. 에러 디코더 테스트:

    • 글로벌 예외 처리 없이 에러 디코더가 400 코드를 반환하는 경우, 이는 FeignClient가 올바른 요청을 하지 못하거나, 서버가 잘못된 응답을 반환하는 상태임을 의미할 수 있습니다.
    • 로깅을 활용하여 요청과 응답의 전체 내용(헤더, 바디)을 확인하시면 좀 더 상세한 원인을 파악하실 수 있습니다.
  4. 전역 예외 처리를 임시로 비활성화:

    • 일단 전역 예외 처리 부분을 임시로 주석 처리하여 FeignClient 자체의 응답과 이를 디코딩하는 부분에서 어떤 일이 벌어지는지 직접 확인해 보는 것도 도움이 될 수 있습니다.

참고할 만한 관련 답변:

비슷한 문제를 겪었던 다른 수강생의 질문과 답변을 참고해 보시면 도움이 될 수 있습니다:
- “Spring Cloud OpenFeign (2) 관련 질문 dto 관련 에러가 발생해요”
- 해당 게시물에서는 비슷한 오류와 해결 방법들에 대한 토론이 이뤄졌습니다. 특히 디버깅과 관련된 정보를 얻으실 수 있습니다.

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

이지수님의 프로필 이미지
이지수

작성한 질문수

질문하기