스프링 환경에서 간편하게 외부 api를 호출할 수 있는 라이브러리인 feign client 를 사용해보도록 하겠습니다.
restTemplate 보다 훨씬 더 간편하게 api를 호출 할 수 있습니다.
feign client의 다양한 기능이 있지만 본 문서에서는 스프링 부트 환경에서 기본적인 기능을 활용해 api 호출을 간단하게 진행해보도록 하겠습니다. 전체 소스 코드는 하단의 github url 등록해두었습니다.
1. 라이브러리 import
#gradle
ext {
set('springCloudVersion', "2020.0.2")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
implementation group: 'io.github.openfeign', name: 'feign-gson', version: '11.0'
}
#maven
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.3</version>
</dependency>
저의 경우 프로젝트가 gradle로 셋팅하여 진행하도록 하겠습니다.
2.샘플 API 선정 - github rest api
json 호출 테스트 api로 github 에서 컨트리뷰터 이력을 확인 할 수 있는 github rest api를 활용 하도록 하겠습니다.
아래 url은 feign client 프로젝트 에 대한 이력을 확인 할 수 있는 api로 주황색 부분을 다른 깃헙 프로젝트 변경하면 해당 프로젝트의 컨트리퓨터 정보를 확인 할 수 있습니다.
ex ) https://api.github.com/repos/OpenFeign/feign/contributors
호출 샘플 ->
3. Feign client 적용
프로젝트는 아래 구성으로 진행하도록 하겠습니다.
각 패키지는 아래 정보를 담고 있습니다. (feigntest2 는 무시)
feigntest
client : feignclient interface 관련 클래스모음
controller : 로컬에서 테스트해볼 기본 컨트롤러
dto : feign client로 api를 호출했을때 결과 값을 매핑할 클래스 Contributor.
resources : application.properties 기본 프로젝트 컨피그 셋팅
#Controller
localhost:8080/v1/github/{owner}/{repo} 를 호출할 때 리턴할 수 있도록 셋팅
실제 api를 호출하는 GitHubFeignService를 autowired해준다.
*@RequiredArgsConstructor 어노테이션을 설정하고 servcie 변수 선언시 final 를 셋팅해주면 autowired 생갹 가능.
#Service
실제 api 호출을 담당하는 GitHubFeignClient 인터페이스를 autowired 해준다.
해당 인터페이스를 통해 컨트리뷰터 정보를 획득하도록 getContributor 메소드를 작성한다.
# @FeinClient 인터페이스 구현
api 호출은 아래와 같이 인터페이스와 메소드를 셋팅해주는 것으로 처리 가능하다.
1. @FeignClient 어노테이션 설정
(name ="feign client 이름 설정" , url="호출할 api url", configuration = "feignclient 설정정보가 셋팅되어 있는 클래스")
2. api를 호출할 메소드 셋팅
url이 가변 이라면, 컨트롤러에서 사용하는 것처럼 @RequestMapping 활용해 api url를 동적으로 변경 할 수 있다. 아래 처럼
메소드에 @RequestMapping 어노테이션 설정, 메소드 파라미터에서 uri에서 변경이 필요한 부분을 @PathVariable 어노테이션을 설정해주면 된다.
# @FeinClient 컨피그 정보 설정
Config 클래스를 생성하고 필요한 각 설정 정보를 아래와 같이 셋팅 가능하다.
Config 클래스를 따로 생성하지 않아도 아래 Bean들은 기본적으로 제공된다.
기본으로 셋팅됨 : [ Logger , Decoder, Encoder, Contract ]
아래 bean들은 기본으로 제공되지 않고 필요시 config 클래스에 생성해주어야 한다.
[Retryer(재요청 횟수 설정), Request.options(타임아웃 설정)]
샘플로 decoder만 커스텀하게 신규로 생성해 보았습니다. 정상적으로 호출됐을 경우(status =200) 로그를 찍도록 해두었습니다.
# Dto 생성 ( api 결과 값이 매핑되도록)
sample api의 리턴 정보를 매핑 할 수 있도록 필드 설정
# @EnableFeignClients 어노테이션 설정 필수!
전체 프로젝트에 feign client 사용이 가능하도록 main 클래스에서 설정해주었다.
전체 프로젝트에 필요하지 않고 특정영역에만 필요하다면 사용을 하는 실제 서비스영역에 설정해줘도 된다. 그럼, 해당 서비스 클래스에서만 사용가능하게 된다.
# application.properties 설정
feinclient 로그 정보 설정(feign client 로그 설정),
빌드없이 소스를 수정하여 반영하도록 설정(spring devtools) ,
브라우저에서 호출시 결과값을 보기 좋게 출력하기 위한 설정(pretty print json)을 해주었다.
4. Feign client 를 활용해 최종적으로 api 호출하기
브라우저에서 컨트롤러에서 설정된 uri를 기준으로 호출해보았다.
/OpenFeign/feign을 붙여주니, https://api.github.com/repos/OpenFeign/feign/contributors 를 호출하게 된다.
같은 포맷을 리턴하는 다른 api를 호출해 보도록 하겠습니다.
https://api.github.com/repos/octocat/hello-world/contributors
-> 정상적으로 호출되는 것을 알 수 있습니다.
다음 포스팅에서는 feign client의 다른 기능을 확인 해보도록 하겠습니다.
전체 소스정보
build99k/feign-api-test: FeignClient Test Sample Code (github.com)
'springboot' 카테고리의 다른 글
[springboot] java로 크롤링 하기 - Jsoup , 네이버 주식 가격 조회 -01 (0) | 2021.09.16 |
---|---|
[비트코인] 업비트 API로 시세 조회 (1) | 2021.09.15 |
[스프링 스터디] IoC 컨테이너와 빈 (1) | 2021.04.12 |
[SpringBoot] 스프링부트 aop Aspectj 적용하기 - 메소드 실행시 특정 로직 수행 (0) | 2020.02.03 |
[springboot] 스프링부트 ajax 호출 예제 - 공공데이터 api활용 (3) | 2019.10.10 |
최근댓글