WebClient vs RestTemplate: 외부 API 호출 클라이언트 선택
WebClient vs RestTemplate: 외부 API 호출 클라이언트 선택
배경
카카오테크캠퍼스 최종 프로젝트에서 에브리타임 API와 연동해야 했다. 안정적이고 유연한 HTTP 클라이언트가 필요했다.
Spring 진영에서 HTTP 클라이언트로 쓸 수 있는 선택지는 크게 두 가지다.
- RestTemplate
- WebClient
RestTemplate의 문제
Spring 공식 문서에 다음과 같은 내용이 있다.
As of 5.0, the non-blocking, reactive WebClient offers a modern alternative to the RestTemplate with efficient support for both sync and async, as well as streaming scenarios. The RestTemplate will be deprecated in a future version and will not have major new features added going forward.
정리하면:
- RestTemplate은 더 이상 새로운 기능이 추가되지 않는다
- 향후 deprecated 될 예정이다
- WebClient가 공식 권장 클라이언트다
WebClient 선택
시스템 전반을 WebFlux로 바꿀 생각은 없었고, 단순히 외부 API 호출만 효율적으로 하면 됐다.
결정:
- 서비스 전반은 Spring MVC 기반으로 개발
- 외부 API 호출은 WebClient로 통일
이렇게 하면 나중에 비동기 처리나 리액티브 확장이 필요할 때 WebClient의 장점을 살릴 수 있다.
트레이드오프
장점:
- Spring 공식 권장 클라이언트 채택
- Connection pool, Timeout, Retry 설정이 유연하다
- 나중에 비동기/리액티브 방식으로 확장 가능하다
단점:
spring-webflux모듈을 추가해야 해서 WebFlux 관련 의존성이 함께 들어온다- 대부분의 호출이
block()으로 처리되어서 논블로킹의 장점을 온전히 활용하지는 못한다 - 팀원들이 WebClient의 리액티브 API를 공부해야 한다
리스크:
block()호출 패턴을 너무 많이 쓰면 성능적 이점이 제한적일 수 있다- WebFlux 의존성 추가로 일부 런타임에서 예상치 못한 충돌 가능성이 있다
배운 점
- 기술 선택에는 트레이드오프가 있다. RestTemplate이 더 익숙하지만, 장기적으로 볼 때 WebClient를 선택하는 게 맞다고 판단했다.
- 서비스 전체를 리액티브로 바꾸지 않아도 WebClient를 쓸 수 있다.
block()으로 동기식으로 쓰면 된다. - 이런 결정은 ADR로 남겨두는 게 좋다. 나중에 왜 이렇게 했는지 설명할 수 있어야 한다.
카카오테크캠퍼스 3기 최종 프로젝트에서 에브리타임 연동 시 고민했던 내용 정리.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.