Spring

RestTemplate vs WebClient 무엇을 써야 할까?

curiousKidd 2025. 7. 23. 23:36
반응형

Spring Boot 개발을 하다 보면, 외부 API를 호출해야 하는 일이 정말 자주 생기죠. 이때 사용할 수 있는 대표적인 HTTP 클라이언트가 바로 RestTemplate과 WebClient입니다. 그런데 둘 중 뭘 써야 할지 고민해본 적 없으신가요? 저도 처음엔 "RestTemplate도 잘 되는데 굳이 WebClient로 바꿔야 하나?" 싶었거든요.

이번 글에서는 실제로 제가 겪은 실무 경험을 바탕으로, RestTemplate과 WebClient를 비교해보고 어떤 상황에서 어떤 걸 쓰는 게 좋은지 정리해볼게요. 이 글이 여러분의 선택에 조금이라도 도움이 되었으면 좋겠습니다!


문제 상황: API 호출, 어떤 방식으로 할까?

몇 달 전, 외부 인증 서버와 통신해야 하는 기능을 개발하게 되었어요. 이 기능은 사용자가 로그인할 때마다 인증 토큰을 발급받아야 했고, 이 과정에서 외부 HTTP API 호출이 필요했죠. 처음엔 익숙한 RestTemplate으로 뚝딱 구현했어요. 잘 작동하긴 했지만, 부하 테스트를 해보니 TPS가 높아질수록 서버 리소스 사용량이 눈에 띄게 늘어나는 게 보이더라고요.

그때 동료가 "이건 WebClient로 바꾸는 게 나을 수도 있어요"라고 조언해줬고, 그제야 저도 본격적으로 WebClient를 써보게 됐죠.


RestTemplate: 여전히 익숙하고 편하다

RestTemplate은 한마디로 말해서 "간편하고 익숙한 동기 방식 HTTP 클라이언트"입니다.

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("https://example.com/api", String.class);

코드 보시면 아시겠지만, 정말 직관적이에요. 개발 초기엔 이 정도만 해도 충분하고, 문서도 많고 예제도 널렸습니다. 그래서 많은 스프링 개발자들이 기본적으로 RestTemplate을 써왔고, 아직도 수많은 프로젝트에서 사용 중이죠.

장점

  • 사용법이 간단하고 익숙하다
  • 예제와 자료가 많아서 입문자에게 유리
  • Spring에서 공식 지원은 중단했지만 여전히 사용 가능

단점

  • 동기 방식이라 리소스 낭비가 크다
  • TPS가 높은 환경에서 성능 병목이 생기기 쉽다

WebClient: 리액티브 프로그래밍을 위한 선택

반면에 WebClient는 Spring WebFlux의 일부로 등장한 리액티브 HTTP 클라이언트입니다. 비동기 방식으로 동작하고, 결과를 Mono 또는 Flux로 반환하죠. 처음엔 생소할 수 있지만, 익숙해지면 정말 유연하고 강력한 도구입니다.

WebClient webClient = WebClient.create();
String result = webClient.get()
    .uri("https://example.com/api")
    .retrieve()
    .bodyToMono(String.class)
    .block();

위 코드는 비동기로 동작할 수 있지만, .block()을 호출해서 동기처럼 처리했어요. 이런 유연함도 WebClient의 장점 중 하나죠.

장점

  • 비동기 방식으로 리소스 사용량을 줄일 수 있다
  • 리액티브 프로그래밍에 최적화되어 있다
  • 연결 타임아웃, 응답 타임아웃, 재시도 등 설정이 유연하다
  • Future, Mono, Flux를 활용한 고급 비동기 처리 가능

단점

  • 러닝 커브가 있다 (처음엔 Mono/Flux 개념이 어렵다)
  • 로그 분석이나 디버깅이 복잡할 수 있다

내가 시도한 방법: 둘 다 써보고 비교해보기

앞서 말한 인증 API 호출 기능을 RestTemplate으로 먼저 만들고, 성능에 이슈가 있어서 같은 로직을 WebClient로 재구현해봤어요. 그리고 둘의 성능을 비교해보기 위해 간단한 부하 테스트(k6)를 진행했죠.

테스트 조건

  • 사용자 100명 동시 로그인 시나리오
  • 인증 토큰 발급 API 응답 시간: 약 300ms
  • 테스트 환경: 로컬 서버, Spring Boot 2.7, Java 17

결과 비교

항목 RestTemplate WebClient

평균 응답 시간 560ms 320ms
에러율 3% 0%
CPU 사용량 높음 낮음

확실히 비동기 방식의 WebClient가 성능 면에서 훨씬 안정적이었고, CPU 자원도 덜 사용했어요. 특히 API 호출이 많은 상황일수록 WebClient의 장점이 두드러졌습니다.


그럼 어떤 걸 써야 할까?

케이스마다 다르겠지만, 아래 기준으로 선택하면 좋을 것 같아요.

RestTemplate이 나을 때

  • 간단한 테스트나 PoC 수준의 프로젝트
  • 동시 요청이 적고, 코드 단순성을 우선할 때
  • Spring MVC 기반 프로젝트이며 리액티브가 불필요할 때

WebClient가 더 나을 때

  • 실시간성이 중요하거나 동시 요청이 많은 서비스
  • 리액티브 프로그래밍을 고려하고 있다면 무조건 WebClient
  • 기존에 WebFlux 기반으로 설계되어 있다면 WebClient가 자연스러움

저는 개인적으로 새로운 프로젝트나 장기적으로 유지보수가 필요한 코드라면 무조건 WebClient를 추천드리고 있어요. 처음에는 익숙하지 않아도, 한두 번 써보다 보면 익숙해지더라고요.


정리 및 느낀 점

처음엔 저도 RestTemplate만 써도 충분하다고 생각했어요. 실제로 많은 예제가 그렇게 되어 있었고, 실무에서도 다들 그렇게 하더라고요. 하지만 실제로 API 호출이 많은 환경에서 성능 이슈를 겪어보고 나서야, 왜 Spring에서 WebClient를 밀고 있는지를 체감했어요.

지금은 거의 모든 신규 API 호출 코드에서 WebClient를 사용하고 있고, 코드의 유연성과 확장성 측면에서도 만족하고 있습니다. 아직도 RestTemplate을 쓰고 있다면, 꼭 한번 WebClient를 실습해보시길 추천드려요!


💡 요약

  • RestTemplate은 사용이 간편하지만, 동기 방식이라 성능상 한계가 있음
  • WebClient는 비동기 방식으로, TPS가 높은 환경에서 더 유리함
  • 실무에서는 점점 WebClient로 전환되는 추세이며, Spring 공식 문서에서도 RestTemplate은 deprecated 예정
  • 지금 시작하는 프로젝트라면 WebClient로 가는 게 장기적으로 유리

이 글이 도움이 되셨다면 댓글이나 공감, 구독은 큰 힘이 됩니다 :)
더 많은 Spring Boot 실무 팁이 궁금하다면 블로그 구독해주세요!

반응형