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. 블로킹과 논블로킹 / 동기와 비동기
블로킹(Blocking)
- 호출된 함수가 완료될 때까지 제어권이 호출한 쪽에 반환되지 않는 방식이다.
- 함수가 실행되는 동안 호출한 스레드는 작업이 끝날 때까지 대기하며, 다른 일을 수행할 수 없다.
논블로킹(Non-blocking)
- 함수 호출 즉시 제어권을 반환하는 방식이다. 함수가 작업을 마칠 때까지 기다리지 않고 다른 일을 계속 수행할 수 있다.
동기(Synchronous)
- 작업이 순차적으로 실행되는 방식이다. 하나의 작업이 끝나야 다음 작업이 시작되며, 코드 실행 흐름이 순서에 의존한다.
비동기(Asynchronous)
- 작업이 병렬로 실행되며, 요청한 작업이 완료될 때까지 기다리지 않고 다음 작업을 실행한다.
- 콜백 함수 또는 Future, Promise와 같은 비동기 처리 메커니즘을 통해 작업의 완료를 알린다.