Programming/Spring Boot

FeignClient 기본적인 사용법 (Spring Cloud OpenFeign)

Jan92 2022. 8. 12. 21:02
반응형

FeignClient

기존 프로젝트에서는 서비스 간 통신에서 RestTemplate을 사용했는데 FeignClient를 통해 조금 더 편리하게 사용할 수 있다고 하여 적용해보며 정리한 내용입니다.

잘못된 부분은 댓글로 남겨주시면 확인하여 다시 공부하고 수정하겠습니다. 미리 감사드립니다.

 


 

Spring Cloud OpenFeign

FeignClient란 Netflix에서 최초로 개발된 선언적 HTTP 클라이언트인데요.

이때는 Spring Cloud Netflix Feign 였으나, 현재는 오픈소스 프로젝트인 OpenFeign로 변경되었는데, OpenFeign가 Spring Cloud OpenFeign에 통합되면서 SpringMVC 어노테이션에 대한 지원 및 HttpMessageConverters를 사용할 수 있게 되었습니다.

 

FeignClient는 HTTP API 클라이언트를 단순화하는 것을 목표로 하는데요.

실제로 인터페이스를 만들고 어노테이션을 적용하는 간단한 방법으로 사용할 수 있으며, 적용해 보시면 Spring Data JPA에서 interface만 정의해서 쿼리를 실행하는 것과 비슷한 느낌입니다.

 

/*

MSA(MicroServiceArchitecture)의 서비스들이 많아지면서 각각의 서비스들 사이에 통신이 많아지게 되었는데, 이때 FeignClient를 도입하면 RestTemplate를 사용하던 방식을 조금 더 편리하게 사용할 수 있으며, 코드상으로도 중복되는 부분을 줄일 수 있다는 장점이 있습니다.

(MSA는 복잡한 웹 시스템에 맞춰 개발된 API 기반의 서비스 지향적 아키텍처 스타일로, 서비스 간 호출 시 API를 사용하기 때문에 통신이 많아지게 됩니다.)

*/

 


 

FeignClient 사용법

1. 의존성 추가

* Maven
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>3.1.1</version>
</dependency>

* Gradle
// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '3.1.1'

첫 번째로 의존성 추가입니다.

Spring Cloud는 Spring Boot 버전과 호환되는 버전을 사용해야 하는데요. 자세한 버전별 호환성은 아래 Spring Cloud의 Release Train을 통해 확인할 수 있습니다.

https://spring.io/projects/spring-cloud

 

 

2. @EnableFeignClients

FeignClient를 사용하기 위해서는 @EnableFeignClients 어노테이션을 필수로 적용해야 합니다.

일반적으로 해당 어노테이션은 메인 애플리케이션 클래스에 설정하는데요. 이 어노테이션은 하위 클래스를 탐색하면서 @FeignClient를 찾아 구현체를 생성하는 역할을 합니다.

(basePackages 또는 basePackageClasses 속성을 통해 탐색할 범위를 설정할 수 있습니다.)

 

@EnableFeignClients

 

 

3. 인터페이스 생성

@FeignClient(name = "testFeignClient", url = "${feign.test.url}", configuration = TestFeignClientConfiguration.class)
public interface testFeignClient {
    
    @GetMapping(value = "/getUrl", produces = "application/json", consumes = "application/json")
    Response getTest(@RequestParam("keyword") String keyword);
}

인터페이스를 생성하고 @FeignClient 어노테이션을 설정합니다.

name 속성에는 페인 클라이언트의 이름을 설정하고, url 속성에는 호출할 api의 url을 설정합니다. configuration 속성의 경우 FeignClient의 설정 정보가 세팅되어 있는 클래스인데요.

configuration에 대해서는 바로 이어서 조금 더 자세하게 살펴보겠습니다.

 

 

4. Configuration 설정

페인 클라이언트에서는 기본적으로 설정되는 Bean들이 있기 때문에 별도의 Configuration을 설정하지 않아도 사용하는 데는 문제가 없는데요.

(해당 내용은 org.springframework.cloud.openfeign.FeignClientsConfiguration 클래스에서 볼 수 있습니다.)

 

기본적으로 제공되는 Bean은 Encoder, Decoder, Logger, Contract, Retryer 등이 있으며, 재요청을 하는 Retryer 같은 경우에는 default 옵션이 Retryer.NEVER_RETRY로 재요청이 비활성화되어 있습니다.

Retryer 외에도 다른 빈들도 default 설정 값을 변경하고 싶다면 custom configuration을 통해 가능합니다.

 

 

import feign.Logger;
import org.springframework.context.annotation.Bean;

public class TestFeignClientConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

/////////////////////////////////////////////////////// 

logging:
  level:
    com.project.security.basic.feign: DEBUG // 각자 FeignClient가 있는 경로 설정(해당 경로는 예시입니다.)

- Custom Logger

해당 예시는 Logger 설정을 변경하기 위해 Custom Logger를 Bean으로 등록한 예시인데요.

FeignClient에서 기본 Logger는 로그를 찍지 않기 때문에 다음과 같이 Logger.Level을 변경해주어야 합니다.

(Logger.Level에는 NONE, BASIC, HEADERS, FULL가 있습니다.)

 

***

custom Logger 설정을 위해서는 한 가지 설정이 더 필요한데 application.yml 또는 application.properties 파일에 다음과 같이 logging.level을 설정해주는 것입니다. 

 

 

import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;

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

- RequestInterceptor

공통으로 사용하는 header를 추가하기 위해서는 다음과 같이 RequestInterceptor를 통해 설정이 가능합니다.

 

(이 두 가지는 간단한 예시며, 해당 설정 외에도 다양한 Custom 설정이 가능하기 때문에 필요한 기능을 추가로 찾아서 적용하신다면 더 좋을 것 같습니다.)

 

/*

FeignClient에 Configuration을 적용할 때 주의할 점이 있는데요.

일반적으로 Configuration Class를 생성할 때는 @Configuration 어노테이션을 적용하게 되는데, FeignClient에 사용할 CustomConfiguration Class에 해당 어노테이션을 설정하게 되면 Bean으로 등록되어 버리고, 모든 FeignClient에서 해당 설정이 적용된 빈을 끌어다가 사용하게 됩니다.

 

따라서 모든 FeignClient에 공통적으로 적용되어야 하는 설정은 @Configuration으로 적용되게 하고, 각각의 페인 클라이언트에 적용되어야 하는 설정은 @Configuration 어노테이션을 설정하지 않고 인터페이스의 configuration 설정을 통해 추가해주어야 합니다.

*/

 

 

 

< 참고 자료 >

 

[MSA] Spring Cloud Feign - 커스터 마이징 설정편

안녕하세요. 오늘은 Spring Cloud Feign의 2번째 시간입니다. 오늘 함께 알아볼 내용은 Spring Cloud Feign의 설정을 커스터마이징 할 수 있는 것은 어떤것들이 있으며 어떻게 커스터마이징 할 수 있는가에

sabarada.tistory.com

 

 

[Web]Feign Client

이번 프로젝트에서 FeignClient를 이용하여 개발해서 개념을 이해하고자 공부해보았다. 특히 공통 헤더를 추가하기 위해 커스터마이즈한 Configuration을 설정하는 부분에 대해 정리하였다. Feign Client

x-ojm.tistory.com

반응형