이 부분이 개인적으로 feign을 공부하면서 가장 시간을 많이 쏟은 부분이다. 저명한 baeldung에서는 feign이 synch & thread-per-request이기에, 멀티 스레드 환경에서는 위험할 수 있다는 설명을 했다.

Behind the scenes, interfaces annotated with @FeignClient generate a synchronous implementation based on a thread-per-request model. So, for each request, the assigned thread blocks until it receives the response. The disadvantage of keeping multiple threads alive is that each open thread occupies memory and CPU cycles.

*baeldung.com : Spring 및 자바 관련 기술 blog*

이 글을 읽고 관련해서 동시성 처리를 어떻게 할 것인지 고민해보았고, 다른 기술 블로그들을 찾아 봤는데, → 여기서 삽질이 시작되었다. 블로그마다 정보가 다 달랐기 때문이다.

FeignClient와 HTTPClient, 그리고 HTTPURLConnection

~~feign은 기본적으로 **Java Standard Library(java.net.URLConnection)**의 HttpURLConnection 클래스를 사용한다. https://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html~~

https://taes-k.github.io/2019/11/05/spring-feign/

https://toss.tech/article/engineering-note-3#

그런데 내가 불러온 feign 라이브러리 버전은 아무리 찾아도 URLConnetion으로 구현된 부분은 보이지 않았다. (토스의 경우, spring boot 2.7.9, JDK 11버전이라고 하니… 뭐 차이가 적지는 않다.)

계속 feignclient 라이브러리 구조를 뒤져보다가.. 클라이언트 관련 인터페이스 쪽에서 java.net.http.HttpClient를 발견했다. 이 부분을 통해 “아 내가 쓰는 feign은 HttpURLConnection이 아니라, java.net.HttpClient 기반이구나.” 라는 판단을 했다.

Untitled

HttpClient

HttpURLConnection vs. HttpClient