Spring , JPA

Spring Cloud OpenFeign 사용법

seulseul 2023. 11. 12. 01:43

개요

open feign 은 RestTemplate , WebClient 와 같이 외부 API 호출 용도로 사용하는 Http client binder 입니다.

Rest Template 를 사용해보신 분은 많은 코드가 축소된 것을 확인할 수 있습니다.

 

의존성 추가

Open Feign은 Spring Cloud 기반의 기술이므로 Spring Cloud에 대한 의존성이 필요하다. 

Spring Cloud 문서를 보면 현재의 Spring Boot 버전에 맞는 버전이 명시되어 있는데, 적합한 버전을 확인한다.

 

 

 

 

 

OpenFeign 활성화

 

OpenFeign을 활성화하려면 다른 스프링 부트 기능들과 유사하게 @EnableFeignClients 어노테이션을 붙여주면 된다. OpenFeign을 활성화하려면 기본적으로 main 클래스에 붙여주면 된다.

@EnableFeignClients
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

하지만 Main 클래스에 @Enable 어노테이션을 붙여주는 것은 SpringBoot가 제공하는 테스트에 영향을 줄 수 있으므로 별도의 Config 파일로 만들어주는 것이 좋다.

root package 에 있지 않은 경우 basePackages 또는 basePackageClasses 를 지정해줘야한다.

@EnableFeignClients 은 지정된 package 를 돌아다니면서 @FeignClient 를 찾아 구현체를 만들어 줍니다.

 

OpenFeign Config

 

 

 

위 Config Class 에는 아래 3가지 설정이 적용돼있으며 모든 Feign Client 에 공통 적용됩니다.

재시도 (Retry) 설정

Feign은 기본적으로 Retry를 시도하지 않으므로 Retry를 시키려면 추가적인 설정이 필요하다.

예를 들어 1초의 간격으로 시작해 최대 2초의 간격으로 간격이 점점 증가하며, 최대 3번 재시도하는 Retryer는 위와 같이 설정할 수 있다.

다만 Feign이 제공하는 Retryer는 IOException이 발생한 경우에만 처리되므로, 이외의 경우에도 재시도가 필요하다면 Spring-Retry를 이용하거나 에러 디코더 혹은 인터셉터로 직접 구현하는 등의 방법을 사용해야 한다.

 

Java8 이상 에서 필수 설정

주고 받는 데이터 타입으로 LocalDate, LocalDateTime, LocalTime 등이 사용된다면 제대로 처리가 되지 않는다.

그러므로 DateTimer 과 관련된 포매터 추가 설정이 필요하다.

Java8 이상에서는 해당 타입들이 자주 사용되므로 기본적으로 등록해두면 좋다.

 

jackson 설정

READ_UNKNOWN_ENUM_VALUES_AS_NULL 기본값(false)
FAIL_ON_UNKNOWN_PROPERTIES 기본값(true)
이 값은 Jackson2 에서 명시적으로 설정을 하지 않았다면 기본값을 false 로 변경합니다.(Jackson2ObjectMapperBuilder#customizeDefaultFeatures)

application.yml

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic

위 application.yml 은 timeout 과 로그 레벨만 정의했습니다.

더 자세한 설정은 Spring Cloud OpenFeign 공식 문서를 참고 해주세요.

 

timeout

OpenFeign이 Defaut로 갖는 tiemout 설정은 다음과 같다.

  • connectTimeout: 1000
  • readTimeout: 60000

위와 같이 설정하면 모든 Feign Client 들의 타임아웃이 5초로 설정됩니다.

 

logging

 Feign은 남길 로그에 따라 4가지 Level 을 제공한다.

  • NONE : 로깅하지 않음 (DEFAULT)
  • BASIC : Request Method와 URL 그리고 Response  상태 코드와 실행 시간을 로깅
  • HEADERS : Request, Response Header 정보와 함께 BASIC 정보를 로깅
  • FULL : Request와 Response의 Header, Body 그리고 메타데이터를 로깅

여기서 주의 사항이 있는데, Feign은 DEBUG 레벨로만 로그를 남길 수 있다. 
그러므로 반드시 basePackage 로그 레벨이 DEBUG로 설정이 되어 있어야 한다.

 

log4j2.xml 

 

 

 

 

 

참고