평소 외부 API나 클라이언트와 연동할 때 WebClient와 RestTemplate을 자주 사용해 왔습니다.
하지만 문득 "정확하게 어떤 차이가 있고, 언제 어떤 걸 써야 할까?"라는 생각이 들어 이번 기회에 정리해보려고 합니다.☁️
🔍 RestTemplate이란?
RestTemplate은 Spring 3부터 지원된 동기 방식의 HTTP 클라이언트입니다.
가장 널리 쓰이는 getForObject(), postForEntity() 같은 메서드들을 통해 API를 쉽게 호출할 수 있어, 직관적이고 익숙한 방식이에요!
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("https://api.example.com", String.class);
다만 단점도 있습니다. 요청을 보내고 응답이 올 때까지 현재 쓰레드를 블로킹하게 됩니다.
트래픽이 많은 시스템에서는 비효율적일 수 있습니다!_!
🌐 WebClient란?
WebClient는 Spring 5에서 새롭게 등장한 비동기/논블로킹 기반의 HTTP 클라이언트입니다.
Spring WebFlux와 함께 리액티브 프로그래밍을 지원하며, Mono, Flux 같은 리액티브 타입을 사용합니다.
WebClient client = WebClient.create();
Mono<String> response = client.get()
.uri("https://api.example.com")
.retrieve()
.bodyToMono(String.class);
응답이 올 때까지 쓰레드를 점유하지 않기 때문에, 리소스를 효율적으로 사용할 수 있고 성능도 좋아질 수 있습니다.
물론 단점도 있습니다. 리액티브 프로그래밍에 익숙하지 않다면 사용법이 어렵게 느껴질 수 있습니다.
🔄 주요 차이점 정리
| 항목 | RestTemplate | WebClient |
| 방식 | 동기(Blocking) | 비동기(Non-Blocking) |
| 등장 시점 | Spring 3 | Spring 5 (WebFlux 포함) |
| 반환 방식 | 바로 객체 반환 | Mono, Flux로 감싼 객체 반환 |
| 성능 | 요청당 쓰레드 점유 | 리소스 효율적 (논블로킹) |
| 사용 난이도 | 쉬움 | 약간 어렵지만 유연함 |
| 향후 방향 | 점진적 폐지 예정 | Spring의 공식 권장 방식 |
👾 예외 처리
RestTemplate 예외 처리
try {
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
} catch (HttpClientErrorException e) {
// 4xx 에러
} catch (HttpServerErrorException e) {
// 5xx 에러
}
WebClient 예외 처리
webClient.get()
.uri(url)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> Mono.error(new RuntimeException("Client error")))
.bodyToMono(String.class)
.subscribe();
→ WebClient는 반드시 retrieve().onStatus()로 상태코드에 따른 처리를 해줘야 안전합니다!
📌 언제 어떤 걸 쓰면 좋을까?
- 간단한 API 호출 / 익숙한 방식이 필요한 경우
→ RestTemplate은 여전히 충분히 사용 가능합니다. - 고성능 / 비동기 처리 / 병렬 요청 등 리소스 최적화가 필요한 경우
→ WebClient가 더 나은 선택입니다. - 새로운 프로젝트를 시작한다면?
→ Spring에서도 공식적으로 WebClient를 권장하고 있으니, 미리 익혀두는 걸 추천
⚠️ WebClient 사용 시 주의할 점
- block()으로 응답을 강제로 동기 처리할 수도 있지만, 리액티브 모델을 깨뜨릴 수 있으니 주의가 필요합니다.
- 예외 처리 방식이 RestTemplate과 다르기 때문에, retrieve().onStatus() 등을 잘 활용해야 합니다.
저도 처음에는 익숙한 RestTemplate만 사용했지만, WebClient를 접하면서 더 유연하고 강력한 방식에 눈을 뜨게 되었습니다. 두 방식 모두 장단점이 있기 때문에, 상황에 따라 적절하게 선택하는 것이 중요합니다.
'Backend > Spring' 카테고리의 다른 글
| JPA + AttributeConverter 사용 시 equals/hashCode가 필요한 이유 (0) | 2025.06.02 |
|---|---|
| [Spring] RestTemplate에서 PATCH가 안 된다면? 원인과 해결 방법 정리 (1) | 2025.03.01 |
| [Spring] @Component vs @Bean (0) | 2024.11.16 |
| [Spring]고성능 비동기 웹 개발의 시작: Spring WebFlux 알아보기 (0) | 2024.11.11 |
| [Spring] 프록시 패턴(Proxy Pattern) (1) | 2024.11.09 |