동기식(Synchronous)방식의 HTTP 통신을 위해 RestClient라는 API가 도입 되었음.RestTemplate 이 사용되었음.WebClient라는 것도 있는데 이는 비동기(Asynchronous) 처리나 스트리밍이 필요한 경우에 사용이 권장됨.RestTemplate과 RestClient는 내부적으로 요청 팩토리, 인터셉터, 메시지 컨버터 등 공통 인프라를 공유하고 있으며 해당 영역의 개선 사항은 두 API 모두에 적용됨.RestClient 중심으로 제공될 예정임.RestTemplate은 유지보수 하는 쪽으로 방향이 잡혔고 앞으로 추가될 고급 기능은 RestClient를 통해 제공됨.인스턴스를 생성할 때는 아래와 같은 정적 팩토리 메서드를 사용함.
create(), create(String baseUrl) or builder()를 통해 생성할 수 있음.기존에 사용하던 RestTemplate과 동일한 설정을 그대로 가져오고 싶다면 create(RestTemplate) or builder(RestTemplate)를 사용.

retrieve() or exchange()를 사용.body(Object) 등을 통해 데이터를 보낼 수 있음.RestTemplate 방식의 코드와 RestClient 방식의 코드를 예시로 비교.@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@GetMapping("/test")
public ResponseEntity<Object> getTest(@RequestParam("location") String location) {
.....
JsonNode vWorldjsonNode = restTemplate.getForObject(GeocoderUrl, JsonNode.class);
}
GeocoderUrl로 HTTP GET 요청을 보내서 반환된 값을 JsonNode타입으로 받겠다는 의미의 코드.getForEntity() 메서드를 사용하면 ResponseEntity 타입으로 받을 수 있어서 바디(body) 뿐만 아니라 상태코드와 헤더를 같이 가져올 수 있음.@Configuration
public class RestClientConfig {
@Bean
public RestClient restClient() {
return RestClient.create();
}
}
@GetMapping("/weather")
public ResponseEntity<Object> getWeather(@RequestParam("location") String location) {
.....
JsonNode vWorldjsonNode = restClient.get()
.uri(GeocoderUrl)
.retrieve()
.body(JsonNode.class);
}
RestClient.create(): static 메서드를 이용해서 인스턴스를 생성.
GeocoderUrl로 HTTP GET 요청을 보내서 반환된 값을 JsonNode타입으로 받겠다는 의미의 코드
body() 대신 toEntity()를 사용하면 ResponseEntity 타입으로 받을 수 있어서 바디(body) 뿐만 아니라 상태코드와 헤더를 같이 가져올 수 있음.
RestClient이전에 주로 사용하던 동기식 HTTP 요청 API.GET 요청.
getForObject(...)getForEntity(...)POST 요청.
postForObject(...)postForEntity(...)RestTemplate은 요청당 하나의 스레드(thread-per-request) 모델을 기반으로 하는 Java 서블릿 API를 사용함.WebClient는 Spring Reactive프레임워크가 제공하는 비동기식 논블로킹을 사용함.
RestTemplate는 HTTP 호출마다 호출한 스레드를 직접 사용하지만
WebClient는 HTTP 호출에 대해 작업(task)을 생성함.
결과적으로 리액티브 방식은 동기/블로킹 방식과 비교하였을 때 더 적은 수의 스레드와 리소스를 사용하면서도 더 많은 로직을 처리할 수 있음.
| 구분 | 초점 | 핵심 |
|---|---|---|
| 동기 / 비동기 | 순서와 결과 | "작업 완료 여부를 누가 신경 쓰는가? 순서가 지켜지는가?" |
| 블로킹 / 논블로킹 | 제어권 (Control) | "작업을 계속할 수 있는가? 아니면 멈춰서 기다려야 하는가?" |
동기 / 비동기는 전체 작업에 대한 순차적인 흐름이 유지되고 있는가? 안 되고 있는가?에 초점을 맞추고블로킹 / 논블로킹은 전체 작업을 멈춰서 기다려야하는지? 계속 해도 되는지?에 초점이 맞춰져있음.