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