본문으로 건너뛰기
개발 머꼬
개발 노트Spring
hohyeon.dev19

RestTemplate이 deprecated 경고를 내는 이유와 WebClient로의 전환

  • #Engineering Note
  • #HTTP
  • #Migration
  • #Spring

문제 발생

Spring Boot 프로젝트에서 기존에 잘 쓰던 RestTemplate을 계속 사용 중인데, 공식 문서와 IDE가 "향후 버전에서 제거 예정은 아니지만 새 기능은 추가되지 않는 유지보수 모드"라는 안내를 하고 있어 마이그레이션이 필요한지 판단이 필요했습니다.

원인 분석

RestTemplate은 스레드를 블로킹하는 동기 방식의 HTTP 클라이언트입니다. Spring 5부터 리액티브 스택(Spring WebFlux)과 함께 **WebClient**가 도입됐고, Spring 공식 문서는 RestTemplate을 유지보수 모드로 전환하면서 새 프로젝트에는 WebClient(또는 Spring 6.1+에서 새로 도입된 RestClient)를 권장하고 있습니다.

핵심 차이는 블로킹 여부입니다.

  • RestTemplate: 요청을 보내고 응답이 올 때까지 호출 스레드가 그대로 대기합니다.
  • WebClient: 논블로킹으로 동작하며 Mono/Flux(리액티브 스트림)를 반환합니다 — 응답을 기다리는 동안 스레드를 다른 작업에 쓸 수 있습니다.

다만 전통적인 Spring MVC(서블릿 기반, 블로킹) 애플리케이션에서 WebClient를 쓰더라도, 결국 어딘가에서 .block()으로 동기적으로 값을 꺼내 쓰게 되면 리액티브의 이점을 실제로 누리지 못하는 경우가 많습니다 — WebClient 도입 자체가 자동으로 성능을 개선해주는 것은 아닙니다.

해결 방안

  1. 애플리케이션 전체가 이미 블로킹(Spring MVC) 구조이고 리액티브로 전환할 계획이 없다면, RestTemplate 대신 Spring 6.1+에서 도입된 **RestClient**를 검토합니다 — 동기 방식이면서도 WebClient와 비슷한 유연한 API를 제공해, 리액티브 스택 없이도 최신 API로 마이그레이션할 수 있습니다.
  2. 애플리케이션이 리액티브 스택(WebFlux)이거나, 논블로킹 I/O로 실제 처리량 이점을 볼 수 있는 상황(동시에 많은 외부 API를 호출하는 경우 등)이라면 WebClient가 맞습니다.
  3. 마이그레이션은 한 번에 전체를 바꾸기보다, 새로 작성하는 코드부터 새 클라이언트를 쓰고 기존 RestTemplate 코드는 유지보수 모드 상태로 당분간 유지하는 점진적 전환이 현실적인 경우가 많습니다 — RestTemplate이 즉시 제거되는 것은 아닙니다.
  4. WebClient로 옮긴 뒤 어딘가에서 .block()을 남발하고 있지 않은지 확인합니다 — 블로킹 스레드에서 .block()을 호출하는 것 자체는 되지만, 리액티브 체인 안에서 .block()을 부르면 예외가 발생할 수 있고, 애초에 논블로킹의 이점을 얻지 못합니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.