기술과 산업/언어 및 프레임워크

Spring Boot 시리즈 29편 – RestTemplate vs WebClient: 외부 API 통신 전략 비교와 적용 가이드

B컷개발자 2025. 5. 12. 16:26
728x90

Spring Boot에서 외부 API를 호출할 때 RestTemplate과 WebClient를 어떻게 선택하고 구현해야 하는지 비교 설명합니다. 실무 기준의 사용 가이드와 적용 예시를 포함합니다.


Spring Boot 시리즈 29편 – RestTemplate vs WebClient: 외부 API 통신 전략 비교와 적용 가이드

대부분의 Spring Boot 프로젝트에서는

  • 다른 서버의 REST API 호출
  • 외부 시스템과의 연동
  • 마이크로서비스 간 데이터 교환
    등 외부 API 호출이 필수적으로 발생합니다.

Spring Boot에서는 크게 RestTemplateWebClient 두 가지 방식이 있습니다.
이번 글에서는 두 방식을 비교 → 장단점 분석 → 실전 코드 예시 순서로 정리합니다.


📌 1. RestTemplate vs WebClient 핵심 비교

항목 RestTemplate WebClient

지원 방식 동기(Synchronous) 비동기(Reactive)
Spring 버전 Spring 3~5 Spring 5 이상
지원 상태 Deprecated 예정 (권장 안함) Spring 공식 권장
사용성 매우 직관적, 단순한 코드 Flux, Mono 등 비동기 스트림 기반
성능 적은 요청량에 적합 고부하, 대용량 처리에 적합
적용 추천 레거시, 단순 연동 새로운 서비스, 마이크로서비스, 고성능 서비스

✅ 2. RestTemplate 사용 방법

1️⃣ 의존성

implementation 'org.springframework.boot:spring-boot-starter-web'

2️⃣ 코드 예시

@RestController
@RequiredArgsConstructor
public class ExternalApiController {

    private final RestTemplate restTemplate;

    @GetMapping("/sync-call")
    public String syncCall() {
        String url = "https://api.publicapis.org/entries";
        return restTemplate.getForObject(url, String.class);
    }
}

→ 응답을 받을 때까지 스레드가 블로킹


3️⃣ Bean 설정 예시

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

🛠️ 3. WebClient 사용 방법

1️⃣ 의존성

implementation 'org.springframework.boot:spring-boot-starter-webflux'

2️⃣ 코드 예시

@RestController
@RequiredArgsConstructor
public class ExternalApiReactiveController {

    private final WebClient webClient = WebClient.create();

    @GetMapping("/async-call")
    public Mono asyncCall() {
        return webClient.get()
                .uri("https://api.publicapis.org/entries")
                .retrieve()
                .bodyToMono(String.class);
    }
}

→ 요청을 보내고 스레드를 반환, 응답이 올 때만 처리


3️⃣ Bean 설정 예시 (Base URL 적용)

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient() {
        return WebClient.builder()
                .baseUrl("https://api.publicapis.org")
                .build();
    }
}

🎯 4. 선택 기준 및 실무 팁

상황 추천 방식

레거시 Spring 프로젝트 RestTemplate
신규 마이크로서비스, Spring Boot 3.x WebClient
고부하/고동시성 API 연동 WebClient
단순 내부 시스템 조회 RestTemplate 가능
향후 유지보수 고려 WebClient 권장 (Spring 공식 권장)

✅ 5. WebClient 고급 사용 예시

1️⃣ 동시 요청 (비동기 병렬 호출)

Mono<String> call1 = webClient.get().uri("/entries").retrieve().bodyToMono(String.class);
Mono<String> call2 = webClient.get().uri("/random").retrieve().bodyToMono(String.class);

Mono.zip(call1, call2)
    .map(tuple -> "결과1: " + tuple.getT1() + " 결과2: " + tuple.getT2());

2️⃣ Timeout, Retry 설정

webClient.get()
        .uri("/entries")
        .retrieve()
        .bodyToMono(String.class)
        .timeout(Duration.ofSeconds(3))
        .retry(2);

✅ 마무리 요약

항목 요약

RestTemplate 간단하고 직관적, 동기 방식, 유지보수 한계
WebClient 비동기/Reactive 기반, Spring Boot 5+ 공식 권장
실무 팁 신규 서비스 → WebClient, 레거시 유지보수 → RestTemplate
고급 기능 WebClient → 동시 요청, Timeout, Retry 지원
향후 전략 Spring Boot 3.x 이후 WebClient 전환 권장

📌 다음 편 예고

Spring Boot 시리즈 30편: Spring Batch – 대용량 데이터 처리 및 배치 시스템 설계 실전 가이드

728x90