Today I Learned

Feign 적용 본문

JAVA & Spring

Feign 적용

하이라이터 2021. 3. 4. 01:09
728x90

Feign이란?

Feign은 NetFlix에서 개발한 오픈소스로, 선언적 방식으로 Rest 기반 호출을 추상화해서 제공한다. 

interface와 annotaion만으로 간단하게 HTTP API 클라이언트를 구현할 수 있으며,

세부적인 내용 없이 사용할 수 있어 코드 복잡도가 낮아진다.


사용법

 

1. 의존성(Dependency)

dependencyManagement {
    imports {
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR10'
    }
}

dependencies {
    compile 'org.springframework.cloud:spring-cloud-starter-openfeign'
}

 먼저 feign을 사용하기 위한 의존성을 추가한다.

  • springCloudVersion은 spring boot 버전과 호환되는 버전을 사용해야한다.
  • 자세한 버전별 호환성은 Spring Cloud의 Release Train을 확인하자

 

2. @EnableFiegnClients

일단 root package에 @EnableFeignClients를 추가한다.

이 어노테이션은 하위 클래스를 탐색하면서 @FeignClient를 찾아 구현체를 생성한다.

만약 root package가 아니라면 basePackages 또는 basePackageClasses 속성을 이용해 커스터마이징해야한다.

@SpringBootApplication
@EnableFeignClients
public class CoinApplication {

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

}

 

3. @FeignClient

다음으로 @FeignClient를 생성한다. 인터페이스로 작성하며, 클래스를 구체화할 필요 없이 어노테이션만 추가한다.

@FeignClient(name="upbitApi", url="${upbit.url}")
public interface UpbitClient {
    @GetMapping("/account")
    String account();
}

name과 url 어노테이션 속성으로 feignClient의 서비스명과 요청할 URL을 입력한다.

추가적인 속성 값으로는 configuration, fallback 등이 있다.

 

4. Configuration

기본적으로 제공하는 설정정보가 있기 때문에 별도의 Configuration을 설정하지 않아도 사용에는 문제가 없다.

하지만 커스터마이징한 설정을 사용하고자 한다면,

Configuration Class를 별도로 구현한 다음 @FeignClient의 Configuration 속성에 입력하면 된다.

 

자세한 설정 별 커스터마이징 방법은 Feign 커스터마이징 설정을 참고하시고,

여기서는 간단하게 공통 Header만 추가해보겠다.

public class UpbitClientConfig {
    @Bean
    public RequestInterceptor requestInterceptor() {
        return requestTemplate -> {
            requestTemplate.header("Content-Type", "application/json");
            requestTemplate.header("Accept", "application/json");
        };
    }
}

공통 header를 추가하기 위해서는 RequestInterceptor 인터페이스를 이용하면 된다.

REST API call을 보내기전에 가로채서 token을 넣은 후 전송하는 방식이다.

 

공통 header가 아니라면 각각의 메소드에서 @RequestHeader로 추가하면 된다.

@FeignClient(name="upbitApi", url="${upbit.url}",
            configuration=UpbitClientConfig.class)
public interface UpbitClient {
    @GetMapping("/account")
    String account();
}

 

Configuration 사용 시 주의사항
Configuration class를 생성하다보면 습관적으로 @Configuration으로 설정하기 쉽다.
하지만 @Configuration으로 설정하게되면 되면 Spring bean으로 등록되어 모든 feign client 대상으로 적용이 된다.
따라서 모든 feign client에 적용되어야하는 설정은 @Configuration으로 적용되게 하고,
client 별로 적용되어야 하는 설정은 @FeignClient의 configuration attribute에 명시해서 추가해야한다.


참고로 같은 설정에 대해서는 @FeignClient의 configuration attribute의 설정으로 덮어씌워진다.

 

 

 

참고

sabarada.tistory.com/115?category=822738

woowabros.github.io/experience/2019/05/29/feign.html

728x90

'JAVA & Spring' 카테고리의 다른 글

Lombok 어노테이션  (0) 2021.03.01
크론(CRON ) 표현식  (0) 2021.02.06
스프링 스케쥴러 (@Scheduled) 설정 및 사용하기  (0) 2021.02.06
Comments