작성
·
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 서버를 하나 더 띄우고
8081 서버로 /api/health2 를 요청한다면 8080서버에서는 ExceptionHandler에서 오류 처리를 안하고, FeignClientExceptionErrorDecoder에서만 에러를 처리합니다. 8081 서버는 GlobalExceptionHandler에서 오류 로그를 남기고 반환할 오류 응답을 만들 것 입니다.
0
0
안녕하세요, 인프런 AI 인턴입니다. 이지수님!
우선 강의를 수강해 주셔서 감사드립니다. 문의하신 부분에 대해 몇 가지 확인해볼 수 있는 사항을 안내드리겠습니다.
에러 반환 상태 코드: 질문하신 내용에 따르면 404 상태 코드를 기대할 수 있는 상황에서 500 상태 코드가 반환됩니다. 이는 주로 잘못된 URL 또는 요청 처리 과정에서의 예외가 제대로 처리되지 않을 때 발생할 수 있습니다.
글로벌 예외 처리: 전역 예외 처리 코드가 먼저 실행되면서 원하는 예외 핸들링이 방해받을 수 있습니다. 따라서 전역 예외 처리 코드가 실제로 어떻게 동작하는지, 특정 예외를 어떻게 핸들링하도록 설정되어 있는지를 확인해 보세요.
API 엔드포인트 확인:
HelloClient
인터페이스의 @GetMapping(value = "/api/health2")
부분에서 리소스가 실제로 존재하는지 확인이 필요합니다.Feign Client 설정:
@FeignClient
에서 사용하는 URL이 올바른지 다시 한 번 확인해 보세요. 로컬 서버가 실제로 http://localhost:8080/api/health2
에 대해 응답을 제공하고 있는지를 테스트해 보시는 것이 좋습니다.에러 디코더 테스트:
FeignClient
가 올바른 요청을 하지 못하거나, 서버가 잘못된 응답을 반환하는 상태임을 의미할 수 있습니다.전역 예외 처리를 임시로 비활성화:
FeignClient
자체의 응답과 이를 디코딩하는 부분에서 어떤 일이 벌어지는지 직접 확인해 보는 것도 도움이 될 수 있습니다.비슷한 문제를 겪었던 다른 수강생의 질문과 답변을 참고해 보시면 도움이 될 수 있습니다:
- “Spring Cloud OpenFeign (2) 관련 질문 dto 관련 에러가 발생해요”
- 해당 게시물에서는 비슷한 오류와 해결 방법들에 대한 토론이 이뤄졌습니다. 특히 디버깅과 관련된 정보를 얻으실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
강사님 안녕하세요, 해당 부분 코드 업로드한 깃허브 주소 전달드립니다. 감사합니다! :)
https://github.com/jisulee-shsf/spring-api-app2/commit/b686cc8d1594e604400fb05bde0d9dec00f91cc6