3.8 외부 API 통신 (RestTemplate, WebClient, RestClient)
스프링 부트 애플리케이션에서 다른 서버의 API를 호출할 때 사용하는 다양한 클라이언트 라이브러리와 동기/비동기 처리 방식을 알아봅니다.
1. RestTemplate (전통적인 방식)
RestTemplate은 스프링 3.0부터 지원된 가장 대중적인 동기(Synchronous), 블로킹(Blocking) 방식의 HTTP 클라이언트입니다.
특징
- 호출 한 번에 응답이 올 때까지 스레드가 기다립니다.
- RESTful 원칙을 따르는 단순한 설계에 적합합니다.
- 현재는 유지보수(Maintenance) 모드이며, 신규 프로젝트에서는
WebClient나RestClient사용을 권장합니다.
사용 예제
@Service
@RequiredArgsConstructor
public class ExternalApiService {
private final RestTemplate restTemplate;
public UserDto getUser(Long id) {
String url = "https://api.example.com/users/" + id;
return restTemplate.getForObject(url, UserDto.class);
}
}
2. WebClient (비동기 처리)
WebClient는 스프링 5.0(WebFlux)과 함께 등장한 논블로킹(Non-blocking), 비동기(Asynchronous) 방식의 최신 클라이언트입니다.
특징
- 응답을 기다리는 동안 스레드가 다른 일을 할 수 있어 리소스 효율이 높습니다.
- 동기 방식(
block())으로도 사용 가능합니다. - 대용량 트래픽이나 리액티브 프로그래밍 환경에 필수적입니다.
비동기 사용 예제
public Mono<UserDto> getUserAsync(Long id) {
return webClient.get()
.uri("/users/{id}", id)
.retrieve()
.bodyToMono(UserDto.class); // 비동기로 데이터를 담은 Mono 반환
}
3. RestClient (스프링 6.1 신규)
스프링 6.1부터 도입된 RestClient는 RestTemplate의 동기 방식과 WebClient의 세련된 Fluent API를 결합한 새로운 동기 HTTP 클라이언트입니다.
특징
RestTemplate의 후계자로,WebClient와 유사한 현대적인 API 구조를 가집니다.- 별도의 WebFlux 의존성 없이도 세련된 코드를 작성할 수 있습니다.
사용 예제
UserDto user = restClient.get()
.uri("/users/{id}", id)
.retrieve()
.body(UserDto.class);
4. 자바 표준 HttpClient (Java 11+)
외부 라이브러리 없이 순수 자바(JDK 11 이상)에서 제공하는 클라이언트입니다.
사용 예제
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com"))
.build();
// 비동기 처리
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
5. 핵심 비교 요약
| 클라이언트 | 방식 | 권장 사항 |
|---|---|---|
| RestTemplate | 동기 | 레거시 프로젝트 유지보수 |
| RestClient | 동기 | ** 신규 스프링 6.1+ 동기 호출 개발 시 추천** |
| WebClient | 동기/비동기 | ** 대용량 트래픽, 비동기 처리가 필요한 경우 필수** |
| HttpClient | 동기/비동기 | 별도 라이브러리 설치를 지양하는 환경 |
팁
스프링 부트 3.2 이상을 사용 중이라면 기능이 중단될 예정인 RestTemplate보다는 더 직관적이고 현대적인 RestClient 사용을 적극 추천드립니다.