[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가 동작하지 않고 직접 컨트롤 할 수 있게 되어 있는 것 같다.

RetryTemplateResponse를 이용하면 try/catch 보다는 깔끔한 코드로 보일 수 있을 거 같은 느낌이다.

global configuration에 대해서는 실수로 Configuration을 붙이게 된다면 문제가 될 수 있으니 ComponentScan에 Filter를 설정하여 사전에 실수를 방지하는 것도 좋아보인다.

참고


Open Feign 관련 example code는 github에 올려두었으니 참고~!

Leave a comment