본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Document

[SpringBoot] 공식 문서 요약(9) - RestTemplate, WebClient

by 김코더 김주역 2022. 1. 8.
반응형

SpringBoot Document Review 9

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/

 

 

 

RestTemplate

https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-resttemplate.html

 

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이 적용되지 않는다.

 

반응형

댓글