Spring

Spring - Feign Client

jaewoo 2023. 4. 24. 14:24

 

기존에 RestTemplate을 사용했었는데 Deprecated된다는 말이 있어 다른 요청방법을 찾아보다가 WebClient를 알게 되었는데 해당 WebClient는 MVC에 적용하는게 맞지 않다는 생각이 들어 Feign Client에 대해 찾아보았다. 

요청날리는 게 RestTemplate보다 간편하다.

 

일단 Feign Client는 무엇일까?

Feign은 Netflix에서 개발된 Http Client Binder이다.

공식문서에 따르면 Feign is a declarative web service client 라고 명시되어있다. 즉 선언적인 웹 클라이언트라는 것이다.

Feign을 사용하려면 interface를 작성하고 해당 interface에 annotation들을 선언해주면 된다.

 

 

코드구현

코드는 공공데이터포털에 데이터에 요청을 넣어 데이터를 json 데이터로 바인딩하는 것과 String으로 뽑는 두 개에 메소드를 만들었다.  

 

먼저 Feign Client를 사용하려면 @EnableFeignClients가 필요하다.

root package에 안 적어도 상관없지만 그러면 basePackages로 FeignClient 를 작성한 interface 있는 곳을 지정해줘야한다. 

해당 EnableFeignClients은 지정된 pakage를 돌아다니면서 @FeignClient 를 찾아 구현체를 만들어준다. 

이때 런타임에 해당 인터페이스에 대한 프록시 객체가 생성되고 프록시 객체를 이용하여 HTTP요청을 보낸다.

빈으로도 사용가능하다.

 

 

FeignClient를 작성하는데 해당 주소는 공공데이터 포털 Open API 주소이다 .각 쿼리스트링으로 완성되어 요청이 들어간다. 컨트롤러 메소드와 작성 방식이 비슷하다.

feignService 는 feignClient를 각각 값들을 넣어서 호출하는 클래스이다. 

getString()은 json 데이터를 그대로 문자열로 출력하고, getObject는 객체로 데이터를 받아서 출력한다.

정상 출력하는 걸 볼 수 있다.

이제 해당 데이터를 String이 아닌 객체로 받아볼 것이다.

 

 

SubwayResponse 클래스는 대충 static inner class로 여러 데이터를 받는 형식으로 구성되어있다. (너무길어서 뺌)

 

해당 클래스를 통해 응답 데이터에 body를 바로 출력하도록 했다. 

 

해당 객체로도 응답을 잘 받을 수 있는 걸 볼 수 있다.

 

 

여기서는 크게 설정하지 않았지만 원래 각 Feign Client마다 Configuration을 적용할 수 있다. 해당 코드처럼 외부 서비스에 API를 호출할 때 공통으로 들어가야하는 header가 있거나 공통적인 응답값을 추가해야하는경우 모두 Configuration을 통해 설정할 수 있따. ex RequestInterceptor

'Spring' 카테고리의 다른 글

AWS - 배포와 기록(Spring boot)  (0) 2023.04.14
Spring - MockMvc  (0) 2023.04.03
Spring - Filter  (0) 2023.03.30
Spring - DispatcherServlet  (0) 2023.02.24
Spring - 작성자 체크하기  (0) 2023.02.09