Spring/Spring Boot

[Spring] Webclient 란❓ (RestTemplate vs WebClient)

민돌v 2022. 11. 8. 10:35

아래의 글 순서대로 읽으시면 해당 글을 이해하시는데 족흠 도움이 됩니다 🙏

⚙️ Block, Non-Block, sync(동기), Async(비동기) 의 간단한 개념 
[Spring] Webclient 란❓ (RestTemplate vs WebClient) (now)
[Spring] WebClient 사용방법 가이드
[spring] WebFlux란 + Reactor 객체란 (Mono<> 와 Flux<>)

 

 

📗 이번 포스팅에서는, Spring 에서 외부 API 와 통신하는 WebClient 에 대해서 공부해보고자 합니다...!!!!

 

옛날 글에서 간단하게 Spring RestTemplate 에 대해서 잠깐 공부한적이 있는데 Spring 5.0 부터는 WebClient를 권장하고

추후부터 RestTemplate 는 deprecated 된다고하여서, 부랴부랴 공부하게되었습니다..ㅎㅎ

 


📌 WebClient란

WebClient란 웹으로 API를 호출하기위해 사용되는 Http Client 모듈 중 하나이며,

RestTemplate를 대체하는, HTTP 클라이언트 입니다.

 

기존의 동기 API를 제공할 뿐만 아니라, 논블로킹 및 비동기 접근 방식을 지원해서 효율적인 통신이 가능하다고 합니다.

 


📌 RestTemplate vs WebClient

  • 두 클라이언트 모듈의 차이점은, RestTemplate  Multi-Thread  Blocking 방식이며,
  • WebClient  Single-Thread  Non-Blocking 방식이라는 것입니다.

 

Non-Blocking 방식이 네트워킹의 병목 현상을 줄이고 성능을 향상시키기 때문에, 

Spring WebClient 를 사용하면 요청자(consumer) 와 제공자(provider) 사이의 통신을 조금 더 효율적인 Non-Blocking 방식으로 진행할 수 있다는 장점이 있습니다.

 

👏🏻 간단한 Block 과 Non-Blocking 의 아주 간단한 개념은 요기를 참고해주세요

 


RestTemplate 의 동작 과정

  • (Multi-Thread & Blocking 방식)

  1. Thread Pool은 어플리케이션 구동 시 설정된 만큼 Thread 를 미리 만들어 놓습니다.
  2. Request는 먼저 Queue 에 쌓이고 가용한 스레드가 있으면 그 스레드에 할당되어 처리됩니다.
  3. 즉,  1 요청당 1 스레드가 할당 됩니다.
  4. 각 스레드에서는 Blocking 방식으로 처리되어 응답이 올 때까지 그 스레드는 다른 요청에 할당될 수 없습니다.

 

📑 RestTemplate의 단점

  • 요청을 처리할 스레드가, 스레드 풀에 충분히 남아있다면 위와같은 방법이 아무런 문제가 없지만
  • 스레드가 다 차는 경우 이후의 요청은 Queue에 대기하게 됩니다.
  • 대부분의 문제는 네트워킹이나, DB 와의 통신에서 문제가 생기기 때문에 락이나 병목현상이 일어나면
  • 가용 가능한 스레드 수가 현저하게 줄어들기 때문에, 전체 서비스가 매우 느려지는 결과로 이어지게 됩니다.

 

 

WebClient의 동작 과정

  • (Single-Thread & Non-Blocking 방식)

 

  1. 각 요청은 Event Loop 내에 Job으로 등록됩니다.
  2. Event Loop는 각 job을 제공자에게 요청한 후, 결과를 기다리지 않고 다른 job을 처리합니다.
  3. Event Loop는 제공자로부터 Callback으로 응답이 오면, 그 결과를 요청자에게 제공합니다.
 
  • WebClient는 이렇게 이벤트에 대한 반응형으로 설계가 되었기 때문에
  • 반응성, 탄련성, 가용성, 비동기성을 보장하는 Spring React 프레임워크를 사용합니다.
  • 또한, React Web 프레임워크인 Spring WebFlux 에서 Http Client로 사용됩니다.
    • (Spring WebFlux란, Spring 5 부터 등장한 Reactive-stack 기반의 웹 프레임워크 입니다. springMVC를 대체할 수 있는 모듈이죠..! 참고글 )

 

 

 

다음 포스팅에서 WebClient의 사용 방법에 대해 다뤄보도록하겠습니당

 


*참고