////
Search
Duplicate

restTemplate, webClient, restClient

이 라이브러리들의 공통점은 HTTP 통신을 지원하기 위해 다양한 기능을 제공해주는 것으로 외부 api를 호출하거나 외부 서비스와 상호작용할 때 그 결과를 처리하기 위해 사용됩니다.
그렇다면 이 기능들의 차이는 뭘까?
차이를 알아보기 전에 라이브러리들을 하나씩 알아보자!!

restTemplate이란?

스프링 프레임워크에서 제공하는 HTTP 클라이언트 라이브러리로 아래와 같은 특징이 있습니다.
1.
HTTP GET, POST, PUT, DELETE 등의 요청을 보낼 수 있다.
2.
HTTP 요청에 대한 헤더를 설정하고 응답을 처리할 수 있다.
3.
요청 본문에 데이터를 추가하여 보낼 수 있다.
4.
응답을 객체로 매핑하여 처리할 수 있다.(JSON 형식의 응답을 자바 객체로 매핑)
이러한 특징들로, 스프링 프레임워크의 일부이기에 다양한 기능지원을 통해 간편한 사용을 할수 있다는 장점이 있습니다. 하지만 단점 또한 존재합니다
가장 큰문제가 바로 동기식 호출입니다. 요청을 보낸 후 응답이 올 때까지 스레드를 차단하는 것을 의미하는데 간단히 말해 호출한 작업이 완료될 때까지 대기하고, 다른 작업을 수행하지 않는 방식입니다. 고객이 많고 응답 시간이 긴 경우에는 성능 문제를 야기할 수 있습니다.
이러한 문제를 해결하고 나온것이 Spring 5부터 도입된 webClient입니다.

webClient란?

스프링 5부터 도입된 리액티브 프로그래밍 모델을 완벽하게 지원하는 HTTP 클라이언트 라이브러리 특징으로는
1.
비동기 및 리액티브 프로그래밍 지원: 비동기 및 리액티브 프로그래밍을 지원하여 논블로킹 및 효율적인 비동기식 호출을 가능하게 합니다.
2.
리액티브 환경과의 통합: 스프링 5부터 도입된 리액티브 스트림을 완벽하게 지원하여 리액티브 환경과의 통합이 용이합니다.
3.
모듈식 및 구성 가능: 기능을 모듈화하여 필요에 따라 추가할 수 있고, 더욱 유연한 구성이 가능합니다.
그렇다면 리액티브 프로그래밍이란 무엇인가??
비동기적이고 논블로킹(non-blocking)한 방식으로 이벤트 기반 애플리케이션을 개발하기 위한 프로그래밍 패러다임으로 대량의 데이터를 다루거나 동시성이 요구되는 다양한 분야에서 유용하게 사용됩니다
특징으로는
1.
비동기성(Asynchronous): 리액티브 시스템은 작업이 완료될 때까지 대기하지 않고, 결과를 기다리는 동안 다른 작업을 수행할 수 있습니다. 이는 시스템의 성능과 확장성을 향상시킵니다.
2.
논블로킹(Non-blocking): 리액티브 시스템은 I/O 작업이나 다른 비동기적 작업을 기다리는 동안 스레드를 차단하지 않습니다. 대신에, 스레드는 다른 작업을 수행할 수 있습니다. 이는 자원의 효율적인 사용을 가능하게 합니다.
3.
이벤트 기반(Event-driven): 리액티브 시스템은 비동기적으로 발생하는 이벤트에 응답하는 방식으로 동작합니다. 이벤트가 발생하면 시스템은 해당 이벤트를 처리하고 필요한 작업을 수행합니다.
4.
스트림 처리(Stream Processing): 리액티브 시스템은 데이터를 스트림 형태로 처리하는 것을 중요시합니다. 이는 데이터의 연속적인 흐름을 처리하기 위한 유연하고 효율적인 방식을 제공합니다.
이 webClient의 단점은 spring-boot-starter-web 에서 지원하지 않기 때문에
spring-boot-starter-webflux 라는 라이브러리를 추가해줘야 합니다. 그로인해 사용하지않는 라이브러리들이 추가될수 밖에 없었습니다. 이러한 webflux 의존성 없이 사용할수 있는 restClient가 만들어졌다.

restClient란?

Spring 6 버전부터 Webflux의존성 없이 사용할수 있는 동기식으로 동작되는 기능으로 WebClient와 거의 유사합니다.
장점으로는 webClient를 사용할때는 Mono와 Flux 등의 객체의 이해도가 필요하지만 restClient는 동기식 호출이기 때문에 사용이 쉽다.