외부 API 호출 WebClient, RestTemplate

마라탕천재 ㅣ 2024. 10. 23. 14:05

1.  RestTemplate

RestTemplate은 Spring Framework에서 제공하는 HTTP 클라이언트 라이브러리로, RESTful 웹 서비스와의 통신을 단순화하기 위해 사용된다.
주로 서버와 서버 간의 동기식 요청을 처리하며, HTTP 요청을 보내고 응답을 수신하는 역할을 수행한다.

 

주요 특징

  • 동기 방식: 동기 방식이므로 블로킹 발생 가능성 있음. 따라서 요청을 보내면 응답이 올 때까지 대기한다.
  • 간결한 API: HTTP 메서드(GET, POST, PUT, DELETE 등)에 대한 기본 메서드들을 제공한다.
  • 단순성: 코드가 간결하고 직관적이기 때문에 사용이 쉽다.
  • 기본적인 예외 처리 제공: RestClientException을 통해 HTTP 통신 중 발생하는 기본적인 예외를 처리한다.

사용법

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

 

2.  WebClient

WebClient는 Spring WebFlux에서 제공하는 HTTP 클라이언트 라이브러리로, 비동기 및 논블로킹(Non-blocking) 방식으로 동작한다.
Spring 5부터 추가된 이 API는 RestTemplate의 대체제로 권장되고 있으며, 비동기 환경에서 더 적합하다.

 

주요 특징

  • 비동기 및 논블로킹 방식: 요청과 응답 처리를 논블로킹 방식으로 수행해 성능이 우수하다.
  • Reactive Streams 지원: Flux, Mono 같은 리액티브 스트림을 지원한다.
  • 고급 기능 지원: 타임아웃, 재시도, 필터링 등 고급 HTTP 요청 관리 기능을 제공한다.
  • 함수형 API 제공: 명령형보다는 함수형 스타일에 가깝다.

 

사용법

// 의존성 설정
implementation 'org.springframework.boot:spring-boot-starter-webflux'
WebClient webClient = WebClient.create("https://api.example.com");
Mono<String> response = webClient.get()
                                 .uri("/data")
                                 .retrieve()
                                 .bodyToMono(String.class);

response.subscribe(System.out::println);

 

 

3.  RestTemplate과 WebClient의 개념과 차이점

구분 RestTemplate WebClient
동작 방식 동기(Synchronous) 비동기(Asynchronous) 및 논블로킹
사용 환경 Spring MVC Spring WebFlux
성능 동기식이므로 블로킹 발생 가능 논블로킹으로 더 높은 성능 제공
API 스타일 명령형(Imperative) 함수형(Functional)
권장 여부 Spring 5 이후로는 WebClient 권장 새로운 애플리케이션에 적합

 

 

4. 블로킹과 논블로킹 / 동기와 비동기

이미지 출처 : https://renuevo.github.io/notion/blocking-nonBlocking-synchronous-asynchronous/

블로킹(Blocking)

  • 호출된 함수가 완료될 때까지 제어권이 호출한 쪽에 반환되지 않는 방식이다.
  • 함수가 실행되는 동안 호출한 스레드는 작업이 끝날 때까지 대기하며, 다른 일을 수행할 수 없다.

 

논블로킹(Non-blocking)

  • 함수 호출 즉시 제어권을 반환하는 방식이다. 함수가 작업을 마칠 때까지 기다리지 않고 다른 일을 계속 수행할 수 있다.

 

동기(Synchronous)

  • 작업이 순차적으로 실행되는 방식이다. 하나의 작업이 끝나야 다음 작업이 시작되며, 코드 실행 흐름이 순서에 의존한다.

 

비동기(Asynchronous)

  • 작업이 병렬로 실행되며, 요청한 작업이 완료될 때까지 기다리지 않고 다음 작업을 실행한다.
  • 콜백 함수 또는 Future, Promise와 같은 비동기 처리 메커니즘을 통해 작업의 완료를 알린다.