REST 클라이언트는 스프링 프레임워크가 제공하는 것이고, 스프링부트는 REST 클라이언트를 쉽게 사용할 수 있도록 Bean을 등록해준다.
RestTemplateBuilder, WebClient.Builder를 Bean으로 등록해준다.
그래서 저 Builder를 주입받아, 필요할 때 마다, 빌드를 해서 rest클라이언트 인스턴스를 생성해서 사용해야한다.
2가지 선택사항이 존재한다.
1. RestTemplate
2. WebClient
2가지 동시에 사용해도 되고, 하나만 사용해도 된다.
RestTemplate: Blocking I/O 기반의 Synchronous API
WebClient: Non-Blocking I/O 기반의 Asynchronous API
예제를 통해 알아보겠다.
web 의존성을 넣어, 프로젝트를 생성해준다.
그리고 Handler를 두 개 생성해준다. hello는 sleep 5초를 주고, world는 sleep 3초를 준다.
그리고 실습해보기 위해, 이 API 서버에 클라이언트를 가정하여 ApplicationRunner로 만들어본다.(REST API의 클라이언트라고 가정)
이 프로젝트에 Spring web 모듈이 들어있기 때문에 RestTemplate을 사용할 수 있다.
따라서 RestTemplateBuilder를 주입받을 수 있다.
그리고 rest api의 시간을 측정해보기 위해 StopWatch를 만들어준다.
RestTemplateBuilder를 이용하여 RestTemplate을 만들어, '/hello'와 '/world'를 호출해볼 수 있다.
이렇게하면 Blocking I/O 기반의 Synchronous API이다. 즉, hello 요청 처리가 끝나기 전까지 다음으로 넘어가지 않는다. 한줄 한줄 순차적으로 진행된다.
실행해보면, hello 요청에서 5초를 기다리고, world에서 3초를 기다려야 종료되므로, 대략 8초 정도가 걸리는 것을 볼 수있다.
WebClient를 사용하려면, WebFlux가 의존성으로 들어와있어야 한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
WebClient.Builder를 주입받아 WebClient를 만든다.
WebClient를 사용하여 요청 처리를 해볼 수 있다.
그러나 이렇게만 하면 코드가 실행되지 않는다. stream api이기 때문에 subscribe를 해줘야된다.
실행 시켜보면, 3초 쯤 지났을 때, world가 찍히고, 5초 쯤일 때 hello가 찍히는 것을 볼 수 있다.
즉, Non-Blocking I/O 기반의 Asynchronous API 이다.
코드는 Non-Blocking으로 쭉 실행되고, subscribe로 요청하면 응답을 Asynchronous하게 실행되는 것이다.