- Spring Cloud OpenFeign, Synchronization2023년 06월 17일
- starryeye
- 작성자
- 2023.06.17.:08
https://spring.io/projects/spring-cloud-openfeign#overview
Spring Cloud OpenFeign
This project provides OpenFeign integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. Features Declarative REST Client: Feign creates a dynamic implementation of an inte
spring.io
선언적 웹 서비스 클라이언트 도구인 open feign 에 대해 알아보자..
Open Feign 특징
open feign 은 spring cloud 생태계에 포함 되어있다.
과거에는 Netflix OSS 프로젝트의 일부였다.
Spring MVC 어노테이션을 함께 사용할 수 있으며, 내부적으로 HttpMessageConverters 를 사용한다.
선언적 HTTP Client 이므로,
Spring Data Jpa 처럼..
인터페이스에 어노테이션을 곁들여서 메서드 선언만 해주면 구현체는 알아서 생성되는 특징을 가지고있다.
동기, 블로킹 I/O 방식으로 요청을 보낸다.
코드로 하나씩 알아보자...
Open Feign 은 스프링 클라우드 프로젝트에 포함되어 관리가 되기 때문에..
의존성 라이브러리를 셋팅할 때 위와 같이 스프링 클라우드 의존성을 추가해준다.
-> 21 ~ 23 line, 35 ~ 39 line
그리고, openfeign 라이브러리 의존성을 추가해준다.
-> 29 line
스프링 클라우드의 버전은 뭘 써야하는가..
https://spring.io/projects/spring-cloud
위와 같이 사용할 스프링 부트 버전에 따른 스프링 클라우드 버전이 존재한다.
-> 필자는 스프링 부트 3.0.x 버전을 사용하므로 .. 2022.0.x 버전 중, 2022.0.3 버전을 사용하였다.
다음으로..
@EnableFeignClients 어노테이션을 사용하여 FeignClient (openfeign 의 Http Client 선언적 인터페이스) 를 인지하여
구현체를 만들도록 한다.
basePackages 요소로 해당 FeignClient 위치를 정해줄 수 있다.
OpenFeign 의 FeignClient 를 만들어보자..
요청할 uri 는 https://https//open.er-api.com/v6/latest 이다.
(USD 기준으로, 전세계 환율을 리턴해준다.)
@FeignClient 어노테이션을 사용하여, 요청 보낼 url 을 설정 해주고..
name 을 설정해준다. (Placeholders 가 지원된다.)
name 요소의 값은 Spring Cloud LoadBalancer 클라이언트를 생성하는데 사용되는 클라이언트 이름이다.
(해당 포스팅에서는 중요하지 않으므로 넘어간다.)
FeignClient 인터페이스에 @FeignClient 를 사용하면
스프링이 자동으로 구현체를 생성하고 해당 객체를 빈으로 등록해준다.
(빈 이름은 인터페이스의 이름이다. 이름을 변경하기 위해서는 qualifiers 요소를 사용하면 된다.)
@GetMapping 어노테이션은 Spring Web 의 바로 그 어노테이션을 사용하는 것이다.
의미는 해당 url 로 "GET 요청을 보내겠다" 이다. (다른 HTTP Method 도 사용할 수 있다.)
getLatest() 메서드를 호출하면 설정한 url 로 동기식 요청을 보내고 응답을 받는다.
현재 예제에서는 ResponseExchangeRates 클래스 형태로 받았는데
이는 해당 요청의 Body (JSON) 을 객체로 바인딩 받기 위함이다.
(귀찮으면 그냥 Map<String, Object> 타입으로 받아보자..)
메서드의 파라미터로는 Controller 개발할 때 처럼 사용하면 된다.(요청을 보낸다의 의미이지만..)
@RequestHeader, @RequestParam, @PathVariable 등을 사용할 수 있다.
중간에 layer 가 있어서 FeignClient 를 바로 사용되는 코드는 아니지만..
변환 없이 동일한 프로퍼티를 사용한다고 생각하자.
CurrencyExchangeRate 는 ResponseExchangeRates 라 생각하면되고
RequestExchangeRatePort 는 MyFeignClient 라 생각하면된다.
수행 결과
설정
커넥션에 관한 타임아웃 설정은 application.yml 로 위와 같이 할 수 있다.
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/appendix.html
기본 값 셋팅과 그 외 다양한 설정 속성은 위 url 에서 확인할 수 있다.
위와 같이 글로벌 공통 설정을 할 수도 있지만..
FeignClient 별로 서로 다른 설정을 해줄수 도 있다.
아래는 예시이다.
위와 같이 타임아웃을 설정할 수 있는 config 파일을 만들고..
위와 같이 해당 설정을 적용할 FeignClient 에 적용하면 개별 적용이 된다.
FeignClient 개별 설정할 수 있는 속성들은 다음과 같다.
요청/응답에 필요한 다양한 속성을 커스텀 할 수 있다. (글로벌 설정도 마찬가지이다.)
위 예시에서 봤던 Request.Options 를 만들기 위한 생성자이다.
또한, 위와 같이 ErrorDecoder 를 이용하면.. 어떤 Http status 의 응답이 왔을 때.. 새로 정의한 예외를 터트릴수 도 있다.
위는 ErrorDecoder 의 decode 메서드 기본 동작 과정이다.
retry 관련 처리를 해주기위해서 RetryableException 을 반환하는 로직도 포함되어있는게 특징이다.
<참고>
@Configuration 개별 설정과 Application.yml 모두 적용을하면.. Application.yml 이 이긴다...
우선순위를 반대로 돌리기 위해서는..
spring.cloud.openfeign.client.default-to-properties 설정 값을 false 로 하자..
다음과 같이.. name 이나 url 이 동일한 FeignClient..
즉, 동일한 서버를 가리키는 FeignClient 인데.. 서로 다른 개별 설정을 하기 위해서는 contextId 를 다르게 줘야한다.
기타
Tomcat 에서 할당된 스레드 그대로 요청 보내고 응답 받으려면 .. 위와 같이 그냥 사용하면 된다. (동기식)
하지만..
비동기로 요청 보내고 싶을 수도 있다.
요청을 처리하는 Tomcat 스레드를 사용하지 않고
외부 API 로 요청을 하는 스레드를 따로 관리하면서 사용하고 싶은 경우
해당 내용은 다음 포스팅때 다뤄 보겠다.
reference
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign
'Spring > Client' 카테고리의 다른 글
Spring 6의 REST Clients 3가지 (0) 2023.03.13 다음글이전글이전 글이 없습니다.댓글