Feign Client 맛보기실제 Open API 사용해보기Header에 값 설정하기configuration 속성 사용@GetMapping에 Header 속성 사용@Headers 어노테이션 사용contract 설정 변경@RequestLine, @Header 사용
Feign Client 맛보기
8081포트를 사용하는 서버에 API를 작성 합니다. 이 API를 외부 API라고 지칭하겠습니다.

그리고 하나의 프로젝트를 더 만들어서 다음과 같이 외부 API를 사용할 수 있도록 만들겠습니다.
FeignClient를 사용할 애플리케이션에서 다음과 같이 @EnableFeignClients 어노테이션을 사용해줍니다.

특정 서비스에서만 사용할 수도 있습니다!

그리고 다음과 같이 인터페이스를 작성해줍니다.
- 사용할 외부 API를 어노테이션으로 작성해주는 것이죠!

서비스 레이어도 작성해줍니다. 방금 만든 HelloClient를 사용해 외부 API에서 받은 응답을 우리 프로젝트의 비즈니스 로직에 포함시킬 수 있겠죠?

컨트롤러도 작성해줍니다.
http://localhost:8080/ 에 요청을 보내면,
testService의 logicUsingHelloApi 함수를 실행시키고,
이 logicUsingHelloApi는 외부 API 서버의 /hello 라는 엔드 포인트에 요청을 보내 “hello 8081 server” 라는 메시지를 가져오는 로직이 포함되어 있습니다.
logicUsingHelloApi는 받아온 메시지를 우리 애플리케이션의 컨트롤러단으로 반환하겠습니다.

http://127.0.0.1:8080/에 요청을 보내 http://localhost:8081/api/hello 의 응답인 “hello 8081 Server”를
출력했습니다.

실제 Open API 사용해보기
방금 간단한 예제를 구현해봤으니 실제 Open API를 사용해 외부 API를 사용해보겠습니다.

일별 박스오피스 API를 사용해서 영화 정보를 받아 사용해보겠습니다.
다음과 같이 요청을 먼저 보내보면..?
https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f5eef3421c602c6cb7ea224104795888&targetDt=20220714&itemPerPage=1
이런 결과를 내어주는군요! 우리 프로젝트에서 이 API를 사용해보겠습니다!!

먼저 똑같은 인터페이스의 응답 DTO를 만들어줬습니다.
@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; }
이번에는 @RequestParam도 사용해봤습니다.
@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); }
대애충 TestService에다가 이런 코드를 작성하고..

컨트롤러도 작성하고 실행하면??

성공적으로 응답을 받아왔습니다!

이제 FeignClient의 자세한 기능에 대해서 조금 더 알아보겠습니다.
Header에 값 설정하기
configuration 속성 사용
@FeignClient의 configuration 속성에 header를 추가하는 Config 클래스를 지정합니다.
configuration = FeignConfig.class
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(); }
확인을 위해 외부 API에서 출력을 해보겠습니다
@RestController @RequestMapping("/api") public class HelloController { private final Logger log = LoggerFactory.getLogger(getClass()); @GetMapping("/hello") public String hello(HttpServletRequest request) { return request.getHeader("header"); } }

@GetMapping에 Header 속성 사용
@FeignClient(name="test", url="http://localhost:8081") public interface TestClient { @GetMapping(value = "/api/hello", headers = "header=valueB") String hello(); }

@Headers 어노테이션 사용
Headers 어노테이션을 사용하기 위해서는 Fegin에서 제공하는 contract를 사용해야합니다.
Fegin에서 제공하는 contract를 사용하게되면 SpringMvcContract에서 제공하는 @GetMapping, @PostMapping, @RequestParam 등을 사용하지 못하고 Feign에서 제공해주는 @RequestLine을 사용해야합니다.(FeginClient 한정)
contract 설정 변경
@Configuration public class ContractConfig { @Bean public Contract feignContract() { return new feign.Contract.Default(); } }
@RequestLine, @Header 사용
@FeignClient(name="test", url="http://localhost:8081") public interface TestClient { @RequestLine("GET /api/hello") @Headers("header: valueD") String hello(); }