Openfeign으로 외부 API 호출하기

2023. 5. 28. 05:22Spring 기초

Intro

최근에 https://thecatapi.com/ 사이트에서 제공하는 데이터를 이용해서,
고양이 사진 정보를 제공하는 API 서버를 만들었습니다.

아 고양이 키우고싶다

제 SpringBoot 서버에서 고양이 사진 정보를 가져올 때, Spring Cloud 라이브러리의 Openfeign를 사용했습니다.
또, 최근에 본 MSA 관련 영상에서도 Openfeign을 이용해 내부 서비스들 간 데이터를 주고받는 것을 보고, 이참에 Openfeign을 포스팅해야겠다 싶었습니다.  

theCatApi가 제공하는 데이터는 아래 링크에 잘 나와 있습니다.

https://developers.thecatapi.com/view-account/ylX4blBYT9FaoVd6OhvR?report=bOoHBz-8t 

 

Report Wrapper - Report Dashboards

 

developers.thecatapi.com

 

Openfeign이란

feign은 Netflix 에서 개발된 Http client binder 입니다. Spring Cloud의 Restful 통신용 라이브러리로,
Rest Call을 하는 클라이언트를 쉽게 작성할 수 있도록 도와줍니다.

현재는 openfeign인 만큼 오픈소스가 되었습니다. 
https://github.com/OpenFeign/feign

 

GitHub - OpenFeign/feign: Feign makes writing java http clients easier

Feign makes writing java http clients easier. Contribute to OpenFeign/feign development by creating an account on GitHub.

github.com

Openfeign의 장점

인터페이스와 어노테이션을 이용해 Rest Call을 하는 클라이언트를 쉽게 구현할 수 있습니다.
Spring Data JPA가 Interface만 지정해서 쿼리실행 구현체를 만드는 것과 유사합니다.

사용법과 소스코드를 보시면 쉽게 이해하실 수 있을 것입니다.

 

소스코드 및 사용법

1. 의존성 추가

//build.gradle

ext {
    set('springCloudVersion', "2021.0.4")
    ...
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

dependencies {

    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

}

springCloudVersion의 경우, 사용하시는 SpringBoot의 버전에 따라 달라지게 됩니다.
저는 2.7x 버전을 사용했으므로 아래 표에 맞는 Spring Cloud의 버전을 추가했습니다.

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

 

2. Feign 설정하기

1) @EnableFeignClients  추가하기

Root package 에 있어야 하며, 그렇지 않은 경우 basePackages 또는 basePackageClasses 를 지정해야 합니다.
저는 Config 클래스를 따로 생성한 뒤 basePackages를 지정했습니다.

해당 packages를 돌면서 @FeignClient가 붙은 인터페이스를 찾아 구현체를 생성하게 됩니다.

@Configuration
@EnableFeignClients("com.prgrms.thecatapi")
class OpenFeignConfig {

   @Value("${cat.api-key}")
   private String apiKey;

   @Bean
   public RequestInterceptor requestInterceptor() {
      return template -> {
         template.header("x-api-key", apiKey);
         template.header("Accept", "application/json");
      };
   }
}

2) 기타 설정 추가

인터셉터를 추가하는 것은 Feign이 제공하는 또 다른 유용한 기능입니다.
Openfeign의 Request Interceptor는 요청 전/후에 특정한 기능을 수행하는 기능을 제공합니다.

theCatApi에서 제공하는 api를 호출하기 위해서는 헤더에 "x-api-key"라는 이름으로 발급받은 Key값을 추가해야 합니다. 따라서 Request Interceptor를 구현하여 헤더에 값을 추가하고 Bean으로 등록했습니다. 

호출하는 메소드마다 각각 header값을 설정할 수 있지만, 제가 호출하는 API는 공통으로 "x-api-key" 값이 필요하기 때문에 config에서 일괄로 설정했습니다. 

Config 클래스에서는 인터셉터 외에도 Logging 설정을 통해 로거를 등록하고 로깅 레벨도 지정할 수 있습니다.

3. FeignClient 작성

Openfeign에 기본적으로 설정되어있는 SpringMvcContract를 이용한다면
Spring MVC의 어노테이션을 이용해 요청 매핑을 처리할 수 있습니다.

@FeignClient(name = "thecatapi", url = "https://api.thecatapi.com/v1")
public interface CatApiFeignClient {
	

    @GetMapping("/images/{id}")
    DetailDto getById(@PathVariable("id") String id);

    @GetMapping("/images/search")
    List<PhotoDto> getRandomImage(@RequestParam("limit") int limit);

    @GetMapping("/images/search")
    List<PhotoDto> getByBreedName(@RequestParam("breed_ids") String breed, @RequestParam("limit") int limit);

}

각각의 메소드는 아래의 API를 호출하게 됩니다.

https://api.thecatapi.com/v1/images/0XYvRd7oD
https://api.thecatapi.com/v1/images/search?limit=1
https://api.thecatapi.com/v1/images/search?breed_ids=beng&limit=1

각각의 호출을 RestTemplate으로 작성했다면 코드가 몇 배는 길어졌을 것입니다.
Openfeign 짱

 


참고

https://techblog.woowahan.com/2630/

 

우아한 feign 적용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요. 저는 비즈인프라개발팀에서 개발하고 있는 고정섭입니다. 이 글에서는 배달의민족 광고시스템 백엔드에서 feign 을 적용하면서 겪었던 것들에 대해서 공유 하고자 합니다

techblog.woowahan.com

https://mangkyu.tistory.com/278

 

[Spring] OpenFeign이란? OpenFeign 소개 및 사용법

최근에 있었던 사내 엔지니어링 데이에서 발표를 하였는데, 상당히 편리하지만 많은 분들이 모르시는 OpenFeign을 준비하였습니다. 그리고 발표하면서 준비했던 내용을 블로그 포스팅에서도 적어

mangkyu.tistory.com

https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/

 

Spring Cloud OpenFeign

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable

docs.spring.io