RestTemplate는 멀티 스레드와 Blocking 방식을 사용하기 때문에, Request는 먼저 Queue에 쌓이고, 가용한 스레드에 할당되어 처리된다. (1요청 당 1스레드)
각 스레드는 Blocking 방식으로 응답이 올 때까지 다른 요청에 할당될 수 없다.
따라서 요청을 처리할 스레드가 없다면, 요청은 Queue에 대기하게 된다.
대부분의 문제는 네트워크나 DB와의 통신에서 생기는데 이런 문제가 여러 스레드에서 발생하면 가용한 스레드수가 현저히 줄어들게 되고, 결국 전체 서비스는 매우 느려질 수 있다.
내부적으로는 아래와 같이 동작한다.
WebCleint는 스프링 5.0에서 추가된 인터페이스다. 스프링 5.0 이전에는 비동기 클라이언트로 AsyncRestTemplate을 사용했었다. 하지만 스프링 5.0 이후부터는 WebClient를 사용할 것을 권장한다.
WebClient는 싱글 스레드와 Non-Blocking 방식을 사용하기 때문에 Core당 1개의 스레드를 사용한다.
각 요청은 Event Loop내에 Job으로 등록이 되며, Event Loop는 각 Job을 제공자에게 요청한 후, 결과를 기다리지 않고 다른 Job을 처리한다.
Event Loop는 제공자로부터 callback으로 응답이 오면, 그 결과를 요청자에게 제공한다.
WebClient는 이렇게 이벤트에 반응형으로 동작하도록 설계되었다.
그래서 반응성, 탄력성, 가용성, 비동기성을 보장하는 Spring React 프레임워크를 사용한다.
또한, React Web 프레임워크인 Spring WebFlux 에서 Http Client로 사용된다.