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 방식)
- Thread Pool은 어플리케이션 구동 시 설정된 만큼 Thread 를 미리 만들어 놓습니다.
- Request는 먼저 Queue 에 쌓이고 가용한 스레드가 있으면 그 스레드에 할당되어 처리됩니다.
- 즉, 1 요청당 1 스레드가 할당 됩니다.
- 각 스레드에서는 Blocking 방식으로 처리되어 응답이 올 때까지 그 스레드는 다른 요청에 할당될 수 없습니다.
📑 RestTemplate의 단점
- 요청을 처리할 스레드가, 스레드 풀에 충분히 남아있다면 위와같은 방법이 아무런 문제가 없지만
- 스레드가 다 차는 경우 이후의 요청은 Queue에 대기하게 됩니다.
- 대부분의 문제는 네트워킹이나, DB 와의 통신에서 문제가 생기기 때문에 락이나 병목현상이 일어나면
- 가용 가능한 스레드 수가 현저하게 줄어들기 때문에, 전체 서비스가 매우 느려지는 결과로 이어지게 됩니다.
WebClient의 동작 과정
- (Single-Thread & Non-Blocking 방식)
- 각 요청은 Event Loop 내에 Job으로 등록됩니다.
- Event Loop는 각 job을 제공자에게 요청한 후, 결과를 기다리지 않고 다른 job을 처리합니다.
- Event Loop는 제공자로부터 Callback으로 응답이 오면, 그 결과를 요청자에게 제공합니다.
- WebClient는 이렇게 이벤트에 대한 반응형으로 설계가 되었기 때문에
- 반응성, 탄련성, 가용성, 비동기성을 보장하는 Spring React 프레임워크를 사용합니다.
- 또한, React Web 프레임워크인 Spring WebFlux 에서 Http Client로 사용됩니다.
- (Spring WebFlux란, Spring 5 부터 등장한 Reactive-stack 기반의 웹 프레임워크 입니다. springMVC를 대체할 수 있는 모듈이죠..! 참고글 )
다음 포스팅에서 WebClient의 사용 방법에 대해 다뤄보도록하겠습니당
*참고
- 뭔가 전문적인 사람의 RestTemplate 와 WebClient 비교글 : https://happycloud-lee.tistory.com/220
- WebClient Spring 공식문서 : https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-client