[Spring] open feign으로 http client 통신하기 (3)
들어가며
open feign에 error response와 global configuration 설정에 대해서 알아보자.
error response 처리
// feign client
@GetMapping("/response/{code}")
fun response(@PathVariable(name = "code") code: Int): Response
- error가 발생했을 때 try/catch를 통해서 핸들링을 해줘야 하지만 returnType을 Response로 하게 되면 에러 발생을 안 할 수 있다.
- 에러가 발생하지 않기에 retry가 적용되지 않는 단점이 존재한다.
// test
@Test
fun responseTest() {
val response = exampleClient.response(500)
log.info("response {}", response)
}
[ExampleClient#response] ---> GET http://localhost:8080/response/500 HTTP/1.1
[ExampleClient#response] ---> END HTTP (0-byte body)
[ExampleClient#response] <--- HTTP/1.1 500 (52ms)
[ExampleClient#response] connection: close
[ExampleClient#response] content-type: application/json
[ExampleClient#response] date: Sun, 19 Apr 2020 11:14:46 GMT
[ExampleClient#response] transfer-encoding: chunked
[ExampleClient#response]
[ExampleClient#response] 500
[ExampleClient#response] <--- END HTTP (3-byte body)
- 테스트를 진행 했을 때
Response
에는 status code, request, body, headers 등 많은 정보들을 포함하고 있다.
configuration
@Configuration
class GlobalConfiguration {
@Bean
fun feignLoggerLevel(): Logger.Level {
return Logger.Level.FULL
}
@Bean
fun localDateFeignFormatterRegister(): FeignFormatterRegistrar? {
return FeignFormatterRegistrar { registry: FormatterRegistry ->
val registrar = DateTimeFormatterRegistrar()
registrar.setUseIsoFormat(true)
registrar.registerFormatters(registry)
}
}
@Bean
fun retryer(): Retryer {
return Retryer.Default(3000, 10000, 30)
}
@Bean
fun decoder(): ErrorDecoder {
return ErrorDecoder { methodKey, response ->
if (HttpStatus.valueOf(response.status()).is5xxServerError) {
throw RetryableException(response.status(), response.reason(), Request.HttpMethod.GET, Date(), response.request())
}
throw RuntimeException()
}
}
}
- global configuration으로 사용하기 위해서는
@Configuration
을 통해서 ComponentScan이 가능하게 셋팅을 해줘야 한다. - 특정 Client에만 적용하기 위해서는
@FeignClient
에 configuration을 이용해 원하는 configuration을 등록해주면 된다. - 특정 configuration을 등록할 때는
@Component
를 붙이지 않아도 된다.
마치며
error handling에 대해서는 약간 아쉬운 부분이 retry가 동작하지 않고 직접 컨트롤 할 수 있게 되어 있는 것 같다.
RetryTemplate
과 Response
를 이용하면 try/catch 보다는 깔끔한 코드로 보일 수 있을 거 같은 느낌이다.
global configuration에 대해서는 실수로 Configuration을 붙이게 된다면 문제가 될 수 있으니 ComponentScan에 Filter를 설정하여 사전에 실수를 방지하는 것도 좋아보인다.
참고
Open Feign 관련 example code는 github에 올려두었으니 참고~!
Leave a comment