HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
SFAM 포트폴리오
SFAM 포트폴리오
/
❗
Feign Client 맛보기
❗

Feign Client 맛보기

 
Feign Client 맛보기실제 Open API 사용해보기Header에 값 설정하기configuration 속성 사용@GetMapping에 Header 속성 사용@Headers 어노테이션 사용contract 설정 변경@RequestLine, @Header 사용

Feign Client 맛보기

8081포트를 사용하는 서버에 API를 작성 합니다. 이 API를 외부 API라고 지칭하겠습니다.
notion image
 
그리고 하나의 프로젝트를 더 만들어서 다음과 같이 외부 API를 사용할 수 있도록 만들겠습니다.
 
FeignClient를 사용할 애플리케이션에서 다음과 같이 @EnableFeignClients 어노테이션을 사용해줍니다.
notion image
 
특정 서비스에서만 사용할 수도 있습니다!
notion image
 
그리고 다음과 같이 인터페이스를 작성해줍니다.
  • 사용할 외부 API를 어노테이션으로 작성해주는 것이죠!
    • notion image
 
서비스 레이어도 작성해줍니다. 방금 만든 HelloClient를 사용해 외부 API에서 받은 응답을 우리 프로젝트의 비즈니스 로직에 포함시킬 수 있겠죠?
notion image
 
컨트롤러도 작성해줍니다.
http://localhost:8080/ 에 요청을 보내면,
testService의 logicUsingHelloApi 함수를 실행시키고,
이 logicUsingHelloApi는 외부 API 서버의 /hello 라는 엔드 포인트에 요청을 보내 “hello 8081 server” 라는 메시지를 가져오는 로직이 포함되어 있습니다.
 
logicUsingHelloApi는 받아온 메시지를 우리 애플리케이션의 컨트롤러단으로 반환하겠습니다.
notion image
 
http://127.0.0.1:8080/에 요청을 보내 http://localhost:8081/api/hello 의 응답인 “hello 8081 Server”를
출력했습니다.
notion image
 

실제 Open API 사용해보기

방금 간단한 예제를 구현해봤으니 실제 Open API를 사용해 외부 API를 사용해보겠습니다.
 
영화진흥위원회 오픈API
영화진흥위원회 오픈API
https://www.kobis.or.kr/kobisopenapi/homepg/apiservice/searchServiceInfo.do
notion image
 
일별 박스오피스 API를 사용해서 영화 정보를 받아 사용해보겠습니다.
 
다음과 같이 요청을 먼저 보내보면..?
 
이런 결과를 내어주는군요! 우리 프로젝트에서 이 API를 사용해보겠습니다!!
notion image
 
먼저 똑같은 인터페이스의 응답 DTO를 만들어줬습니다.
 
이번에는 @RequestParam도 사용해봤습니다.
 
대애충 TestService에다가 이런 코드를 작성하고..
notion image
 
컨트롤러도 작성하고 실행하면??
notion image
 
성공적으로 응답을 받아왔습니다!
notion image
 
 
이제 FeignClient의 자세한 기능에 대해서 조금 더 알아보겠습니다.
 

Header에 값 설정하기

 

configuration 속성 사용

@FeignClient의 configuration 속성에 header를 추가하는 Config 클래스를 지정합니다.
 
configuration = FeignConfig.class
 
확인을 위해 외부 API에서 출력을 해보겠습니다
notion image
 

@GetMapping에 Header 속성 사용

notion image

@Headers 어노테이션 사용

Headers 어노테이션을 사용하기 위해서는 Fegin에서 제공하는 contract를 사용해야합니다.
 
Fegin에서 제공하는 contract를 사용하게되면 SpringMvcContract에서 제공하는 @GetMapping, @PostMapping, @RequestParam 등을 사용하지 못하고 Feign에서 제공해주는 @RequestLine을 사용해야합니다.(FeginClient 한정)
 

contract 설정 변경

@RequestLine, @Header 사용

https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&targetDt=20220714&itemPerPage=1
@AllArgsConstructor @NoArgsConstructor @Getter public class ApiResponse { private BoxOfficeResult boxOfficeResult; } @Getter @NoArgsConstructor @AllArgsConstructor public class BoxOfficeResult { private String boxofficeType; private String showRange; private List<DailyBoxOffice> dailyBoxOfficeList; } @AllArgsConstructor @Getter @NoArgsConstructor public class DailyBoxOffice { private String rnum; private String rank; private String rankInten; private String rankOldAndNew; private String movieCd; private String movieNm; private String openDt; private String salesAmt; private String salesShare; private String salesInten; private String salesChange; private String salesAcc; private String audiCnt; private String audiInten; private String audiChange; private String audiAcc; private String scrnCnt; private String showCnt; }
@FeignClient(name = "api", url = "https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice") public interface BoxOfficeClient { @GetMapping("/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888") ApiResponse getTopMovie(@RequestParam String targetDt, @RequestParam int itemPerPage); }
public class FeignConfig { @Bean RequestInterceptor requestInterceptor () { return requestTemplate -> requestTemplate.header("header","valueA","valueB"); } }
@FeignClient(name="test", url="http://localhost:8081", configuration = FeignConfig.class) public interface TestClient { @GetMapping("/api/hello") String hello(); }
@RestController @RequestMapping("/api") public class HelloController { private final Logger log = LoggerFactory.getLogger(getClass()); @GetMapping("/hello") public String hello(HttpServletRequest request) { return request.getHeader("header"); } }
@FeignClient(name="test", url="http://localhost:8081") public interface TestClient { @GetMapping(value = "/api/hello", headers = "header=valueB") String hello(); }
@Configuration public class ContractConfig { @Bean public Contract feignContract() { return new feign.Contract.Default(); } }
@FeignClient(name="test", url="http://localhost:8081") public interface TestClient { @RequestLine("GET /api/hello") @Headers("header: valueD") String hello(); }