본문으로 건너뛰기
Advertisement

3.8 외부 API 통신 (RestTemplate, WebClient, RestClient)

스프링 부트 애플리케이션에서 다른 서버의 API를 호출할 때 사용하는 다양한 클라이언트 라이브러리와 동기/비동기 처리 방식을 알아봅니다.

1. RestTemplate (전통적인 방식)

RestTemplate은 스프링 3.0부터 지원된 가장 대중적인 동기(Synchronous), 블로킹(Blocking) 방식의 HTTP 클라이언트입니다.

특징

  • 호출 한 번에 응답이 올 때까지 스레드가 기다립니다.
  • RESTful 원칙을 따르는 단순한 설계에 적합합니다.
  • 현재는 유지보수(Maintenance) 모드이며, 신규 프로젝트에서는 WebClientRestClient 사용을 권장합니다.

사용 예제

@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부터 도입된 RestClientRestTemplate의 동기 방식과 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 사용을 적극 추천드립니다.

Advertisement