SpringBoot Document Review 9
https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/
RestTemplate
WebClient
https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-webclient.html
1. RestTemplate
1) RestTemplate 소개
- 애플리케이션에서 원격 REST 서비스를 호출할 때 사용할 수 있다.
- Spring Boot는 RestTemplate에 대한 자동 설정 Bean을 제공하지 않고, RestTemplateBuilder에 대한 자동 설정을 제공한다. RestTemplateBuilder은 RestTemplate을 빠르게 구성할 수 있는 많은 유용한 메소드들을 포함한다.
- 자동 설정된 RestTemplateBuilder은 HttpMessageConverters가 RestTemplate 인스턴스에 적용되도록 한다.
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
public Details someRestCall(String name) {
return this.restTemplate.getForObject("/{name}/details", Details.class, name);
}
}
2) RestTemplate 커스터마이징
- 커스터마이징 범위에 따라 3가지 방법이 사용된다.
- 최대한 커스터마이징 범위를 줄이고 싶다면, 자동 설정된 RestTemplateBuilder을 주입 받아서 적절한 메소드를 호출한다. 각 메소드는 새 RestTemplateBuilder 인스턴스를 리턴하기 때문에, 커스터마이징은 Builder의 사용에 영향을 끼친다.
- 커스터마이징 범위를 애플리케이션 전반으로 하고싶다면, RestTemplateCustomizer Bean을 사용한다. 이 Bean들은 자동으로 자동 설정된 RestTemplateBuilder에 등록된다.
- 별도로 RestTemplateBuilder Bean을 등록하는 방법이 있다. 이 방법은 자동 설정을 적용하지 않으며, RestTemplateCustomizer Bean을 사용하지 못한다.
2. WebClient
1) WebClient 소개
- 2개 이상의 REST 요청을 병행으로 수행할 수 있는 방법이다.
- WebClient를 사용하기 위해 classpath에 Spring WebFlux가 존재해야 한다.
- WebCilent.create() 메소드를 사용하여 별도로 builder를 생성할 수 있다.
@Service
public class MyService {
private final WebClient webClient;
public MyService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://example.org").build();
}
public Mono<Details> someRestCall(String name) {
return this.webClient.get().uri("/{name}/details", name)
.retrieve().bodyToMono(Details.class);
}
}
※ 이 이후에는 각 요청 작업에 대한 Event에 따른 트리거 메소드들을 사용하면 된다. doOn* 계열의 메소드들이 트리거 메소드에 해당된다.
(참고) https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html
2) WebClient Runtime
- Spring Boot는 WebClient를 구동할 때, classpath에 있는 사용 가능 라이브러리들을 참고하여 어느 ClientHttpConnector을 사용할지 자동으로 탐지해준다. 현재는 Reactor Netty와 Jetty RS client가 지원된다.
- 기본적으로 spring-boot-starter-webflux 스타터는 io.projectreactor.netty의 reactor-netty 라이브러리에 의존하며, 서버와 클라이언트 구현체를 제공해준다. 만약 Reactive 서버로 Jetty를 사용하고 싶다면, org.eclipse.jetty의 jetty-reactive-httpclient Dependency를 추가하면 된다.
- 서버와 클라이언트에 동일한 기술을 적용한다면 HTTP 자원들이 자동으로 공유된다.
- 개발자는 별도의 ReactorResourceFactory 혹은 JettyResourceFactory Bean을 제공함으로써, Jetty와 Reactor Netty에 대한 자원 설정을 override할 수 있다. 이 Bean들은 서버와 클라이언트에 둘다 적용된다.
- 별도의 ClientHttpConnector Bean을 정의함으로써, client 설정에 대한 모든 제어를 직접할 수도 있다.
3) WebClient 커스터마이징하기
- 커스터마이징 범위에 따라 3가지 방법이 사용된다.
- 최대한 커스터마이징 범위를 줄이고 싶다면, 자동 설정된 WebClient.Builder를 주입 받아서 적절한 메소드를 호출한다. WebClient.Builder 인스턴스들은 상태를 추적할 수 있다. builder는 싱글톤이기 때문에, builder의 변화는 해당 builder로 생성된 모든 클라이언트들에 반영된다. 하나의 builder로 여러 클라이언트들을 생성하고 싶다면 다음과 같이 clone() 메소드를 사용하면 된다.
WebClient.Builder other = builder.clone();
- 커스터마이징 범위를 애플리케이션 전반으로 하고싶다면, WebClientCustomizer Bean을 선언하고 주입 지점에서 로컬로 WebClient.Builder을 변경하면 된다.
- WebClient.create() 메소드를 사용하면 원래의 API를 사용할 수 있으며, 자동 설정이나 WebClientCustomizer이 적용되지 않는다.
'Spring Series > Document' 카테고리의 다른 글
[SpringBoot] 공식 문서 요약(11) - Actuator 관리 (0) | 2022.01.16 |
---|---|
[SpringBoot] 공식 문서 요약(10) - Actuator Endpoint (0) | 2022.01.15 |
[SpringBoot] 공식 문서 요약(8) - NoSQL 기술 (0) | 2021.12.30 |
[SpringBoot] 공식 문서 요약(7) - SQL 데이터베이스 (0) | 2021.12.19 |
[SpringBoot] 공식 문서 요약(6) - Security, OAuth2 (0) | 2021.11.27 |
댓글