OpenFeign
설명
- 선언적 웹 서비스 클라이언트를 작성하기 위한 Java HTTP 클라이언트 바인더 라이브러리이다.
- Feign의 주요 목적은 REST API 를 사용하는 서비스 간의 통신을 단순화하고, MSA 구조상 Service Client 를 쉽게 생성할 수 있도록 등장했다.
Spring Cloud 와의 연관성
- 스프링 클라우드는 MSA 같은 분산 시스템 패턴을 쉽게 구현할 수 있게 지원하는 프레임워크의 모음중 하나이다.
- 역사는 Netlix OSS 부터 시작하는데.. 이건 너무 길어서 제외함
공식문서상 호환
- 현재 나는 스프링 부트 2.7.16 버전이기에, 2021.0.x aka Jubilee 버전을 사용하면 될 것같다.
그래들 추가
ext {
set('springCloudVersion', "2021.0.4")
}
---
디펜던시에
implementation platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
추가가 필요하다.
- 왜 위와 같이 라이브러리를 추가해주는 걸까?
- 프로젝트 전체에서 사용할 라이브러리의 버전을 한 곳에서 관리하기 위하여 사용한다.
- ext 블록을 사용해 프로젝트 전체에서 사용할 라이브러리의 버전을 한 곳에서 관리한다면
- 버전 업데이트시에 여러 곳을 수정하는 대신 한 곳만 변경해주면 된다.
- 플랫폼 키워드(
platform
)를 사용하여 BOM을 들고와서 BOM 에 정의된 의존성을 관리한다.
- 그럼 아래 방식이랑 뭐가 다른건가요?
dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } }
- OpenFeign 관련 검색중 관련 예제를 찾았는데 해당 예제에서는 dependencyManagement > imports > mavenBom 키워드를 사용중이였는데 아마, 관습적으로 혹은 낮은 버전을 사용하고 있는 경우인 것 같다.
- Gradle 5 이후부터는 gradle platform 키워드가 등장하여 해당 방식으로 사용하기를 권장하는 것 같다.
- 아래 링크를 참고하자.
관련 어노테이션 및 설정 추가
- 들어가기 전에..
- 일단 메인 클래스자체에서는 별도의 어노테이션을 붙히지 않는 것을 권장하더라..
- 그래서 별도 config 파일로 분리해야할 것이다.
Config 설정
@Configuration
@EnableFeignClients(basePackages = "com.psj.itembrowser.security.common.openfeign.service")
public class OpenFeignConfig {
@Value("${juso.url}")
private String jusoUrl;
@Value("${juso.confmKey}")
private String jusoConfmKey;
}
@Configuration
- 을 통하여 빈으로 등록하고 해당 파일이 설정파일임을 알린다.
@EnableFeignClients
- Feign 클라이언트를 활성화
- Feign을 사용하여 HTTP 요청을 처리할 인터페이스를 스캔할 기본 패키지를 지정
- basePackages 의 경우 해당 패키지 위치에 FeignClient 가 위치한다는 의미
OpenFeign에서 타임아웃과 재시도 설정
- yml 에 설정하는 법과, 자바파일로 설정하는 방법 2가지가 존재하는데, 여기서는 yml 로 설정하겠다.
- 자바 파일의 경우 일부 메서드가 depreciated 될 상황이라, 대안이 존재하면 사용하는 게 맞을 것 같다.
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
retryer: full
- 재시도 관련 설정
- 재시도를 활성화하려면 기본적으로 Retryer 빈이 명시적으로 선언되어 있어야 한다.
@Configuration @EnableFeignClients(basePackages = "com.psj.itembrowser.security.common.openfeign.service") public class OpenFeignConfig { @Value("${juso.url}") private String jusoUrl; @Value("${juso.confmKey}") private String jusoConfmKey; @Bean public Retryer feignRetryer() { return new Retryer.Default(1000, 5000, 3); } }
- 각 인자는
- 재시도 사이의 초기 간격(밀리초)
- 재시도 사이의 최대 간격(밀리초)
- 최대 재시도 횟수
- 각 인자는
- 재시도를 활성화하려면 기본적으로 Retryer 빈이 명시적으로 선언되어 있어야 한다.
클라이언트 호출부
@FeignClient(name = "AddressApiOpenFeign", url = "${juso.url}")
public interface AddressApiOpenFeign {
@GetMapping
AddressResponseDto getAddress(
@RequestParam("confmKey") String confmKey,
@RequestParam(value = "currentPage", defaultValue = "1") String currentPage,
@RequestParam(value = "countPerPage", defaultValue = "10") String countPerPage,
@RequestParam("keyword") String keyword,
@RequestParam(value = "resultType", defaultValue = "json") String resultType
);
}
- 단순히 선언부 작성만으로, 외부 API 를 호출이 가능해짐.
- 사용한 단순 서비스 호출식으로 사용하면 된다.
사용
@Service
@RequiredArgsConstructor
public class ShppingInfoValidationService {
private final AddressApiOpenFeign addressApiOpenFeign;
@Value("${juso.confmKey}")
private String confmKey;
public AddressValidationResult validateAddress(ShippingInfo shippingInfo) {
AddressResponseDto addressResponseDto = addressApiOpenFeign.getAddress(confmKey, "1", "1",
shippingInfo.getZipCode(), "json");
...
}
}
+) 주소 API 신청
- 발급 받은 키를 resource 아래 juso.key 에 담아서 저장
- 해당 key 파일은 gitignore에 반드시 추가해야한다.
참고
Uploaded by N2T
'자바 > 리팩토링' 카테고리의 다른 글
리스트의 요소가 단일값인 경우 Collections.singletonList 를 사용해야하는 이유 (0) | 2024.02.19 |
---|---|
엔티티안의 내부 클래스 (0) | 2024.02.19 |
[프로젝트] 주문 생성시 Location 헤더와 HTTP 상태코드 201 Created 를 반환하는 건 어떨까? (0) | 2024.02.12 |
[이벤트 리스너] @TransactionalEventListener (0) | 2024.02.07 |
__mysql 5.7 에서 H2 1.4.200 호환을 위한 SCHEMA 수정__ (0) | 2024.02.07 |