[스프링] HttpClient 선택 : WebClient vs FeignClient

임하정·2024년 3월 22일
post-thumbnail

머플러 소셜 로그인을 구현하면서 API 통신할 일이 생겼다.
기존 웹 형식으로 구현했을 때는
SpringSecurity OAuth를 사용했기때문에 내가 따로 요청을 보낼 일이 없었는데,
이번에 앱 형식으로 로그인을 해야하다 보니
토큰 검증을 위해 백엔드에서 외부 API와 통신을 해야했다!

예전에 구현했을 때는 WebClient로 구현했었는데,
이때는 사실 잘 모르는데 어버버 따라한거였다..😅
이번에 Netflix에서 쓴다는 FeignClient를 알게 되어서
둘 중 어떤걸 쓸지 정해보기로 했다.




FeignClient

  1. Netflix에서 RestTemplate보다 효율적인 통신을 위해 개발한 라이브러리
  2. Blocking
  3. 동기 방식 → 대량 요청 처리 시 성능 이슈 발생 가능성
  4. 선언적 API를 정의하므로 코드 작성 용이
    개발자가 HTTP 요청을 명시적으로 작성할 필요 없음

WebClient

  1. Spring5부터 도입
    RestTemplate를 Depreciated하고, WebClient를 쓰길 강력 권장
  2. Non-blocking
  3. 비동기 방식이 기본이지만, 동기처럼 동작하게 할 수 있음



Comparision

성능비교

해당 그래프는 동시 사용자에 따른
동기 방식과 비동기 방식의 성능 차이를 테스트한 그래프이다.
빨간색은 동기 방식인 RestTemplate을,
초록색은 비동기 방식인 WebClient를 사용한 결과이다.
1000명 이하로는 둘의 성능은 비슷하다.
하지만 그 이상으로 넘어갈수록 성능 차이가 급격히 심해진다.

Baeldung에서도
둘을 비교하는 Spring Boot FeignClient vs WebClient Article이 있다.
여기서도 결론적으로는
FeignClient가 코드 인지성도 좋고 많은 상황에서 좋은 선택이지만,
high-traffic 상황에서 시스템 자원을 덜 쓰는
non-blocking 스타일의 WebClient를 사용하는 것을 추천하고 있다.



in my case ...🤔

우리 서비스 머플러인 경우에는
iOS 가계부 어플리케이션으로 사실 아직까지는 천 명 이상이나 되는 사람이
동시에 가입할 확률은 매우 적다고 생각한다...
저번에 WebClient로 구현했을 때,
코드가 은근 복잡하고 가독성이 좋지 않았다고 생각하기 때문에
이번에는 FeignClient로 구현해보기로 결정❗️

0개의 댓글