Spring Framework
FeignClient Response로 Http status 제어하기
Junuuu
2023. 12. 1. 00:01
728x90
개요
FeignClient를 다루다 보면 200~300번대가 아닌 상태코드에 대하여 ErrorHandling을 수행해야 할 경우가 있습니다.
하지만 ErrorDecoder에 의해 FeignClient Exception이 발생하곤 하는데 이에 대해서 대응하는 방법을 찾아보고자 합니다.
Response객체
public final class Response implements Closeable {
private final int status;
private final String reason;
private final Map<String, Collection<String>> headers;
private final Body body;
private final Request request;
private final ProtocolVersion protocolVersion;
...
}
return Type으로 Response 객체를 받으면 예외 없이 http 호출 결과를 반환받을 수 있습니다.
status, body등에 대한 정보를 파악할 수 있습니다.
호출부
@FeignClient(
name = "localTestFeign",
url = "http://localhost:8080",
)
interface LocalFeignClient {
@GetMapping("/internal-call")
fun getProfiles(): Response
@GetMapping("/internal-call-return-404")
fun get404(): Response
@GetMapping("/internal-call-return-400")
fun get400(): Response
}
404, 400, body에 대한 반환값을 모두 Response로 받습니다.
호출 예시
HTTP/1.1 404
connection: keep-alive
content-length: 0
date: Tue, 14 Nov 2023 16:07:52 GMT
keep-alive: timeout=60
HTTP/1.1 400
connection: close
content-length: 0
date: Tue, 14 Nov 2023 16:07:52 GMT
HTTP/1.1 200
connection: keep-alive
content-type: application/json
date: Tue, 14 Nov 2023 16:07:58 GMT
keep-alive: timeout=60
transfer-encoding: chunked
feign.Response$InputStreamBody@23d05182
Body에 대한 파싱
@GetMapping("/outer-call")
fun `외부 호출용 메서드`(){
val response = localFeignClient.getProfiles()
val objectMapper = ObjectMapper()
objectMapper.registerModule(kotlinModule())
val responseBody = objectMapper.readValue(response.body().asInputStream(), ClientProfileResponse::class.java)
println(responseBody)
}
objectMapper를 등록하고 Response객체의 body값의 inputStream을 objectMapper를 통해 파싱 합니다.
호출결과
ClientProfileResponse(profiles=[Profile(col1=1)])
마무리
Response객체를 활용하면 Body값을 파싱해야하는 불편함이 있지만 Http status code를 직접적으로 예외 없이 핸들링 할 수 있습니다.