CS

RestTemplate, WebClient, RestClient, FeignClient

KJihun 2025. 2. 15. 17:20
728x90

 

Spring에서 HTTP 통신을 수행하는 방법에는 여러 가지가 있다.

많이 사용되는 세 가지 방법(RestTemplate, WebClient, RestClient)과

이외에 사용 가능한 HTTP 통신 방법까지 정리하려고 한다.

 

 


 

1. RestTemplate (Spring 3~4)

특징

  • 동기(Synchronous) 방식의 HTTP 클라이언트
  • RestTemplate 객체를 사용하여 간단한 API 호출이 가능
  • Spring 5 이후로는 권하지 않는 방법
 

RestClient 알아보기 (RestTemplate이 Deprecated 된다고요?)

Spring Boot 3.2에 새롭게 추가된 RestClient에 대해 알아보자.spring docs의 RestTemplate에 대한 설명에 위와 같은 NOTE가 추가되었다. Spring 6.1(Spring Boot 3.2) 버전부터는 RestClient가 더 모던한 API를 제공한다는

poalim.tistory.com

 

장점

  • 간단한 API 호출을 쉽게 수행할 수 있음 (getForObject, postForEntity 등)
  • 설정 없이 바로 사용 가능

단점

  • 동기 방식이므로 블로킹(Blocking)됨 → 대규모 트래픽 처리 시 비효율적
  • 확장성 부족 (로깅, 커스텀 타임아웃 설정 등)

예제 코드

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

 

 

 

 


 

 

 

2. WebClient (Spring 5~)

특징

  • 비동기(Asynchronous), 논블로킹(Non-Blocking) 방식
  • Spring WebFlux 와 함께 사용 가능
  • Reactor 기반으로 동작하며 Mono, Flux를 지원
 

[Spring WebFlux] 1. Mono와 Flux에 대한 이해(1) : 작동 방식과 이해

🏝 0. 이전 글 (0. 리액티브 프로그래밍의 소개) [Spring WebFlux] 0. 리액티브 프로그래밍의 소개 🤔 1. 리액터(Reactor)는 무엇인가요? 간단 용어 정리 - Reactive Stream : JVM 위에서 실행될 수 있는 리액티

hoons-dev.tistory.com

 

장점

  • 비동기 방식을 통한 많은 요청을 동시에 처리하는 등 뛰어난 성능
  • 높은 확장성과 다양한 설정 지원

단점

  • 기존의 동기 방식 코드와 혼합하기 어렵고 Reactive에 익숙하지 않으면 사용이 어려울 수 있음
 

Reactive(반응형) 프로그래밍과 Spring WebFlux 기본 개념

이번 포스팅에서는 반응형(Reactive) 모델이 최근 떠오르고 있는 이유와 이에 대한 장단점, 반응형 프로그래밍을 표준화하기 위한 과정들, Spring에서 기존 서블릿을 대체하는 반응형 네트워크 엔진

jh-labs.tistory.com

 

예제 코드

WebClient webClient = WebClient.create("https://api.example.com");
String response = webClient.get()
        .uri("/data")
        .retrieve()
        .bodyToMono(String.class)
        .block(); // 동기적으로 변환
System.out.println(response);

⚠️ .block()을 사용하면 동기적으로 변환되지만, WebClient의 비동기 특성을 살리지 못하므로 가급적 사용하지 않는 것이 좋음.

 

 

 

 


 

 

3. RestClient (Spring 6~)

특징

  • RestTemplate WebClient장점을 조합한 새로운 HTTP 클라이언트
  • RestTemplate처럼 사용하기 쉬우면서도 WebClient의 유연성과 비동기 기능 지원
  • 기본적으로 WebClient 기반으로 동작하며, 동기 및 비동기 방식 모두 지원

장점

  • 코드가 간결하고 가독성이 뛰어남
  • 동기 & 비동기 방식 모두 지원
  • RestTemplate의 대체제로 적합

단점

  • Spring 6 이상에서만 사용 가능 (Spring Boot 3+ 필요)

예제 코드

RestClient restClient = RestClient.create("https://api.example.com");
String response = restClient.get()
        .uri("/data")
        .retrieve()
        .body(String.class);
System.out.println(response);

 

동기 방식으로 호출했지만, .toBodilessEntity() 등을 사용하면 비동기 방식도 가능함.

 

 

 

 

 


 

4. FeignClient

 

✅ 특징

    • Netflix에서 개발한 Http Client 이며, 현재는 오픈 소스로 전환되어 SpringCloud 프레임 워크 중 하나로 사용됨
    • 인터페이스를 작성하고 어노테이션을 통해 따로 구현체 없이 Http Client 를 구현 할 수 있음
    • 기존의 HttpClient 보다 사용하기 더욱 간단하며, 더 많은 장점들을 가지고 있음
    • 선언형(Declarative) HTTP 클라이언트 : 어노테이션 사용으로 자동으로 생성할 수 있음
    • 다른 서비스와의 통신을 간편하게 처리 가능

✅ 장점

  • 인터페이스 기반으로 구현 간편하며, 간결한 코드로 작성 가능
  • Spring Cloud와 쉽게 통합 가능 (로깅, 로드 밸런싱, 리트라이 등 지원)
  • 유지보수 및 가독성이 뛰어남
  • SpringMvc에서 제공되는 어노테이션사용 가능
  • 통합 테스트가 및 커스텀이 간편함

❌ 단점

  • Spring Cloud 환경에서 사용해야 하므로 추가 설정 필요
  • 기본적으로 동기 방식을 지원하며, 비동기 호출을 위해 별도 설정 필요

✅ 예제 코드

 

 

@SpringBootApplication
@EnableFeignClients		// 추가
public class EcommerceApplication {

    public static void main(String[] args) {
        SpringApplication.run(EcommerceApplication.class, args);
    }

}
@FeignClient(name = "mailgun", url = "https://api.mailgun.net/v3/")
@Qualifier("mailgun")
public interface MailgunClient {

    @PostMapping("sandbox92a3501de81b4fd894cc45108c2e5e8a.mailgun.org/messages")
    Response sendEmail(@SpringQueryMap SendMailForm form);

}

📌 각 방법 비교

방법 동기/비동기 특징 주 사용처 Spring 버전
RestTemplate 동기 간단하지만 비효율적 레거시 시스템, 간단한 API 호출 Spring 3 ~ 4
WebClient 비동기 논블로킹, 고성능 고성능 API 호출, WebFlux 환경 Spring 5 ~
RestClient 동기 & 비동기 최신 방식, 간결함 Spring Boot 3+ 환경 Spring 6 ~
FeignClient 동기 (비동기 가능) 선언적 API 호출 마이크로서비스, 클라우드 환경 Spring Cloud

 

 

 

 

 


 

 

결론

 

 

📌 RestTemplate를 사용하는 경우

  • Spring 버전이 5 이하이거나 기존 프로젝트에서 사용중일 경우

 

 

📌 WebClient를 사용하는 경우

  1. 비동기 & 논블로킹(Non-Blocking) 이 필요한 경우
    • 동시 요청이 많은 경우(예: 마이크로서비스, 고트래픽 API 호출)
    • 예시: 여러 개의 외부 API 데이터를 동시에 가져와야 할 때
  2. 대용량 데이터를 스트리밍이 필요한 경우 (예: SSE, WebSocket)
    • 실시간 데이터를 처리해야 하는 경우
    • 예시: 주식 가격 스트리밍, 실시간 채팅 서비스
  3. Spring WebFlux(리액티브) 기반에서
    • Mono, Flux 같은 리액티브 스트림을 사용해야 할 경우
    • 예시: 웹 애플리케이션에서 여러 개의 API를 동시에 호출하여 데이터를 조합
  4. API 응답 시간이 일정하지 않고 백프레셔(Backpressure) 처리가 필요한 경우
    • 느린 API 응답을 효율적으로 처리해야 할 때
    • 예시: 사용자 요청이 많을 때 성능 저하 없이 처리
  5. 비동기 인증 처리(OAuth2, JWT 등)가 필요한 경우
    • API 호출 전에 액세스 토큰을 가져와야 하는 경우
    • 예시: 외부 인증 서버와 연동할 때

 

📌 RestClient를 사용하는 하는 경우

 

  1. 동기(Synchronous) API 호출이 필요한 경우
    • RestTemplate처럼 간단한 HTTP 요청을 실행하고 싶을 때
    • 예시: 내부 API 호출(마이크로서비스 간 통신)
  2. RestTemplate에서 마이그레이션(Spring 6+)이 필요한 경우
    • RestTemplate의 대체제로 사용 가능
    • 예시: RestTemplate을 사용 중인 기존 프로젝트 업그레이드
  3. 동기 & 비동기 혼합 사용이 필요한 경우
    • 기본적으로 동기 방식이지만, 필요할 때 비동기 지원도 하고 싶을 때
    • 예시: 대부분 동기 호출이지만 특정 API는 비동기로 처리해야 할 때
  4. 더 간결하고 유지보수하기 쉬운 코드가 필요한 경우
    • RestTemplate보다 직관적이고 가독성이 좋은 API 제공
    • 예시: 간단한 API 호출 코드 작성
  5. WebClient의 모든 기능이 필요하지 않은 경우
    • 완전한 리액티브 시스템이 필요하지 않고, 단순한 REST API 호출만 필요한 경우
    • 예시: 웹 애플리케이션에서 간단한 REST API 요청 처리

 

📌 FeignClient를 사용하는 경우

 

  • 마이크로서비스 간의 통신이 필요한 경우
  • Spring Cloud 환경에서 쉽게 HTTP 요청을 처리하고 싶을 때
  • 인터페이스 기반의 간결한 API 호출을 원할 때

 

Spring에서 HTTP 통신을 수행하는 방법은 다양하며, 프로젝트 환경과 요구사항에 따라 적절한 방법을 선택해야 한다.

RestTemplate은 더 이상 권장되지 않으며,

최신 프로젝트에서는 RestClient, WebClient, FeignClient를 활용하는 것이 바람직하다.