기술과 산업/언어 및 프레임워크
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에서는 크게 RestTemplate과 WebClient 두 가지 방식이 있습니다.
이번 글에서는 두 방식을 비교 → 장단점 분석 → 실전 코드 예시 순서로 정리합니다.
📌 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