개념


  • 보다 쉽게 REST 클라이언트를 구현할 수 있도록 도와주는 자바 라이브러리
    • Feign 은 가짜라는 뜻이다.
  • 처음은 넷플릭스에서 자체적으로 개발한 오픈 소스 소프트웨어였다.
    • 현재는 스프링 프레임워크에 포함되어 있다.
  • 인터페이스 형태로 REST API 요청 메서드를 선언하면 런타임 시점에서 자동으로 구현체가 생성된다.
    • Spring Data Jpa 처럼 단순히 인터페이스 선언만으로 REST API 호출기능을 구현할 수 있다.
    • 스프링 프레임워크의 기본 웹 관련 여러 Annotation 들과 함께 사용한다.
  • RestTemplate 같은 다른 REST 클라이언트 라이브러리와 유사하지만 훨씬 간편하고 몇가지 추가적인 기능도 제공한다.
    • 요청/응답에 대한 매핑 지원, 자동 재요청, 로드 밸런싱 등

사용 방법


의존성

  • 추가해야 할 의존성
    ext {
        set('springCloudVersion', "2022.0.0")
    }
    
    dependencies {
        implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    }
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }
    • springCloudVersion 은 Spring Boot 버전과 맞는 버전을 사용해야 한다.

구현

@EnableFeignClients 선언

  • FeignClient 빈을 탐색하고 등록해서 사용하겠다는 Annotation
  • 탐색을 위해 어플리케이션에서 의존관계 최상위 빈에 선언하는것이 일반적이다.
    @EnableFeignClients
    @SpringBootApplication
    class FakeshopApplication
    
    fun main(args: Array<String>) {
        runApplication<FakeshopApplication>(*args)
    }

@FeignClient 선언과 REST Client 구현

@FeignClient(
        name = "smody-api-caller",
        url = "https://admin.smody.co.kr",
        configuration = [FeignConfig::class]
)
interface SmodyApiCaller {
    @GetMapping("/challenges")
    fun getChallenges(
            @RequestParam size: Int,
            @RequestParam cursorId: Int
    ): List<SmodyRetrieveResponse.Challenge>
}
  • 인터페이스에 @FeignClient 를 선언하고 관련 속성 값들을 설정한다.
    • name : FeignClient 가 요청하는 서비스 이름을 명시하는 속성, 필수값이다.
    • url : 요청을 보낼 서비스의 Base URL
    • qualifier : FeignClient 의 Bean Name
    • configuration : FeignClient 를 위한 커스텀 Configuration 클래스 세팅
  • 인터페이스 메서드 형태로 REST Client 를 구현한다.
    • @RequestMapping 계열의 Annotation 을 사용하여 Path 를 설정할 수 있다.
    • 기본적으로 Return 타입으로 선언한 dto 클래스로 결과가 자동 매핑되어 반환된다.
    • @RequestParam, @PathVariable, @RequestBody 등과 같은 Annotation 으로 요청에 필요한 값들을 매개변수로 설정할 수 있다.

Custom Configuration

@Configuration
class FeignConfig {
    @Bean
    fun options(): Request.Options {
        return Request.Options(
                3000L, TimeUnit.MILLISECONDS,
                7000L, TimeUnit.MILLISECONDS,
                false
        )
    }
}
  • @FeignClientconfiguration 속성을 통해서 커스텀 Configuration 을 설정할 수 있다.
    • FeignClient 관련 설정 빈을 생성하는 Configuration 클래스를 세팅하는 방식으로 설정한다.
      @FeignClient(
              name = "smody-api-caller",
              url = "https://admin.smody.co.kr",
              configuration = [FeignConfig::class]
      )
    • configuration 속성을 설정하지 않는다면 기본 설정으로 동작한다.
      • org.springframework.cloud.openfeign.FeignClientsConfiguration
  • 할 수 있는 설정들
    • 요청 옵션 설정
      • Connet Timeout, Read Timeout 등
      • feign.Requset.Options 빈 등록을 통해 설정 가능
    • Basic Auth 설정
      • feign.auth.BasicAuthRequestInterceptor 빈 등록을 통해서 설정 가능
    • 요청 헤더 설정
      • 헤더 설정은 꼭 Configuration 을 통한 빈 등록으로 세팅할 필요없다.
      • @RequestHeader Annotation 을 활용할 수도 있다.
    • Decoder 설정
      • feign.codec.Decoder 빈 등록을 통해 설정 가능

0개의 댓글

Powered by GraphCDN, the GraphQL CDN