-
FeignClient vs WebClient vs RestTemplateSpring Framework 2023. 7. 13. 00:01728x90
개요
다른 서버와 통신하기 위해서 즉, REST API로 서비스 간 통신하기 위해서 ReignClient, WebClient, RestTemplate 등을 활용하곤 합니다.
이 셋에 대해 알아보고 장/단점에 대해 비교해보고자 합니다.
RestTemplate이란?
HTTP 요청을 만들기 위해 Spring Framework에서 제공하는 동기식 클라이언트 라이브러리입니다.
오랫동안 인기 있는 선택이였기 때문에 많은 개발자들이 사용법에 익숙하며 대규모 커뮤니티가 존재하는 안정적인 라이브러리입니다.
단점으로는 Blocking I/O를 사용합니다.
이로 인해 동시성이 높은 시나리오에서 성능 문제가 발생할 수 있습니다.
또한 Spring 5.0 이후부터 RestTemplate은 레거시 라이브러리로 간주되면 WebClient가 권장되는 추세입니다.
FeignClient란?
Netflix에서 RestTemplate보다 효율적인 통신을 위해 선언적 접근 방식을 활용한 라이브러리입니다.
HTTP 클라이언트 인터페이스를 정의하면 클라이언트를 쉽게 구축하고 유지 관리할 수 있습니다.
Spring Cloud와 통합되어 circuit breaker, retry 같은 기능을 제공합니다.
단점으로는 RestTemplate과 동일하게 Blocking I/O를 사용하여 동시성 높은 시나리오에 문제가 발생할 수 있습니다.
Spring Cloud OpenFeign 문서
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/
WebClient란?
Spring 5에서 출시되었으며 WebFlux의 라이브러리의 일부로 Non-blokcing I/O를 활용한 리액티브 프로그래밍 모델을 기반으로 합니다.
이를 통해 확장성과 동시 요청 처리를 활성화시킵니다.
하지만 꼭 비동기로 해야하는것만 아니라 동기처럼 동작하게 할 수도 있습니다.
단점으로는 reactive programming의 단점으로 학습곡선이 가파를 수 있습니다.
Deperecated는 제쳐두고우선 RestTemplate은 Deprecated되었기 때문에 선택지에서 제외하고자 합니다.Spring javaDoc에서 RestTemplate를 Deprecated한다고 선언한적이 있었습니다.
https://github.com/spring-projects/spring-framework/issues/24503
하지만 해당 이슈를 보면 사용 deprecate 보다는 maintenance mode로 들어간다고 합니다.
Deprecated는 되지 않았지만 Spring Doc에서도 Webclient를 추천하고 있습니다.
RestTemplate은 제쳐두고 우리는 이제 FeignClient와 WebClient를 선택할 수 있습니다.
쉬운 선택, 비동기 vs 동기
FeignClient와 WebClient를 선택하는 방법은 동기 프로그래밍이냐 비동기 프로그래밍인가에 따라 다를 것 같습니다.
앞서 설명했듯이 WebClient는 비동기상황의 이벤트기반아키텍처에서 활용할 수 있습니다.
이외에는 단순한 FeignClient가 더 좋을 것 같습니다.
더 나아가서, Reactive-Feign
Spring WebClient를 Reign으로 구현한 Feign Reactive가 존재합니다.
Feign의 선언적 구문을 사용하며 WebClient의 빠르고 비동기적인 능력을 활용할 수 있습니다.
공식 라이브러리
https://github.com/OpenFeign/feign/tree/master/reactive
비공식 라이브러리
https://github.com/PlaytikaOSS/feign-reactive
참고자료
https://www.baeldung.com/spring-boot-feignclient-vs-webclient
https://stackoverflow.com/questions/67191617/springboot-feignclient-vs-webclient
'Spring Framework' 카테고리의 다른 글
Kotlin + Spring Boot 3 Spring Data envers 적용 (0) 2023.07.18 log4j, logback, log4j2 비교 (0) 2023.07.16 FeignClient 헤더 가져오기 (0) 2023.07.12 Spring Cloud Feign FallbackFactory가 동작하지 않는다 (2) 2023.07.06 Spring Boot 2 to Spring Boot 3 마이그레이션 (0) 2023.06.07