Backend Development/SPRING

[Spring HTTP Client] 1. RestTemplate vs WebClient vs RestClient

foreverWon 2026. 2. 25. 16:48
목차

    외부 API 호출은 백엔드 개발에서 거의 필수적인 기능이다.
    결제, 인증, 메시징, 지도, 사내 MSA 통신 등 대부분의 서비스는 외부 시스템과 통신한다.

    Spring에서는 HTTP 호출을 위해 세 가지 주요 클라이언트를 제공한다.

    • RestTemplate
    • WebClient
    • RestClient

    이번 글에서는 이 세 가지의 차이점과 특징을 정리한다.

    1. 비교

    구분 등장 시기 방식 현재 권장 여부
    RestTemplate Spring 3 Blocking (동기) 유지보수 모드
    WebClient Spring 5 Non-blocking (Reactive) 적극 권장
    RestClient Spring 6 Blocking (동기, 개선형) 최신 대안

    2. RestTemplate

    1) 개요

    • 과거 표준 HTTP 클라이언트
    • 동기(Blocking) 방식

    요청을 보내고 응답이 올 때까지 현재 스레드를 대기시킨다.

    RestTemplate restTemplate = new RestTemplate();
    
    ResponseEntity<User> response =
        restTemplate.getForEntity(
            "https://api.example.com/users/1",
            User.class
        );
    
    User user = response.getBody();

    2) 특징

    • JdbcTemplate과 유사한 템플릿 패턴 구조
    • 설정이 단순하고 직관적
    • 내부적으로 HttpMessageConverter 사용
    • exchange() 메서드로 다양한 HTTP 요청 처리 가능
    • 인터셉터 등록 가능

    3) 한계

    • 요청 동안 스레드가 차단(Block)
    • 트래픽 증가 시 스레드 풀 고갈 가능성
    • Reactive 지원하지 않음

    현재는 유지보수 모드로 신규 프로젝트에서는 권장되지 않는다. (Spring은 WebClient를 차세대 HTTP 클라이언트로 권장하며,
    RestTemplate에는 새로운 기능을 추가하지 않고 있다.)

    다만 레거시 프로젝트에서는 여전히 많이 사용되므로 코드를 알고는 있어야 한다.


    3. WebClient

    1) 개요

    • Spring WebFlux 기반
    • 비동기 + 논블로킹(Non-blocking) HTTP 클라이언트
    WebClient webClient = WebClient.create("https://api.example.com");
    
    Mono<User> userMono = webClient.get()
        .uri("/users/1")
        .retrieve()
        .bodyToMono(User.class);

    2) 특징

    • Reactor 기반 (Mono, Flux)
    • 함수형 API (메서드 체이닝)
    • 적은 스레드로 높은 동시성 처리 가능
      • 요청 대기 동안 스레드를 점유하지 않기 때문에, 동일한 하드웨어 자원으로 더 많은 동시 요청을 처리할 수 있다.
    • MSA 환경에서 다수의 외부 API 호출에 유리
    • 현재 가장 많이 사용되는 HTTP 클라이언트

    WebClient는 요청을 보낸 뒤 스레드를 점유하지 않고, 응답이 도착하면 이벤트 기반으로 처리한다.

    3) 언제 사용하는가?

    • 외부 API 호출이 많은 서비스
    • 트래픽이 높은 환경
    • 여러 API를 동시에 호출해야 하는 경우
    • 비동기 파이프라인 구성 시

    현재 Spring에서 가장 권장되는 방식이다.

    (Blocking vs Non-blocking, Mono/Flux, 예외 처리 등은 별도 글에서 다룰 예정)


    4. RestClient

    1) 개요

    • 동기(Blocking) HTTP 클라이언트
    • RestTemplate의 공식 후속 대안

    WebClient의 함수형 스타일을 가져오되, 동작 방식은 기존처럼 Blocking이다.

    RestClient restClient = RestClient.create();
    
    User user = restClient.get()
        .uri("https://api.example.com/users/1")
        .retrieve()
        .body(User.class);

    2) 특징

    • Blocking 방식
    • WebClient와 유사한 깔끔한 체이닝 API
    • RestTemplate보다 직관적인 구조
    • Spring MVC 환경에서 공식 권장되는 동기 HTTP 클라이언트

    3) 등장 배경

    RestTemplate은 오래된 설계 구조이고, WebClient는 Reactive 기반이라 러닝 커브가 존재한다.

    Spring 6에서는 동기 환경에서도 깔끔한 API를 사용하도록 RestClient를 새롭게 제공했다.


    5. 정리

    1) 구조적 차이

    • RestTemplate → 레거시 유지보수
    • WebClient → 
    • RestClient → Spring MVC + 단순 동기 호출

    2) 실무 선택 기준

    • Spring MVC 기반 일반적인 서비스 → RestClient
    • 고트래픽, 다수 외부 API, MSA → WebClient
    • 기존 레거시 유지보수 → RestTemplate

    6. 마무리

    외부 API 호출은 단순히 “HTTP 요청을 보내는 것”이 아니다.

    • 스레드 모델
    • 동시성
    • 장애 대응
    • 커넥션 관리

    까지 고려해야 한다.

     

    이번 글에서는 세 가지 HTTP 클라이언트의 차이와 특징만 정리했다.
    다음 글에서는 WebClient의 내부 동작 원리(Blocking vs Non-blocking, Mono/Flux, 예외 처리 등)를 자세히 정리해보려 한다.

    728x90