포스트

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 라이센스를 따릅니다.