36. REST 서비스 호출 WebClient by ys

classpath에 Spring WebFlux가 있으면 WebClient를 사용하여 원격 REST 서비스를 호출하도록 선택할 수도 있습니다. RestTemplate과 비교하여, 이 클라이언트는 더 기능적인 느낌을 가지며 완전히 반응합니다. WebClient에 대한 자세한 내용은 Spring 프레임 워크 문서의 전용 섹션에서 확인할 수 있습니다.

Spring Boot는 WebClient.Builder를 생성하고 사전 구성합니다. 구성 요소에 삽입하여 WebClient 인스턴스를 만드는 것이 좋습니다. Spring Boot는 HTTP 리소스를 공유하고 코덱을 서버와 같은 방식으로 반영하도록 해당 빌더를 구성합니다 (WebFlux HTTP 코덱 자동 구성참조).

다음 코드는 일반적인 예를 보여줍니다.

@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);
	}

}

36.1 WebClient 런타임

Spring Boot는 응용 프로그램 클래스 경로에서 사용할 수있는 라이브러리에 따라 WebClient를 구동하는 데 사용할 ClientHttpConnector를 자동으로 감지합니다. 지금은 Reactor Netty 및 Jetty RS 클라이언트가 지원됩니다.

spring-boot-starter-webflux스타터는 기본적으로 io.projectreactor.netty:reactor-netty에 의존하며, 이는 서버와 클라이언트 구현 모두를 가져옵니다. Jetty를 반응 형 서버로 대신 사용하는 경우 Jetty Reactive HTTP 클라이언트 라이브러리 인 org.eclipse.jetty:jetty-reactive-httpclient를 추가해야합니다. 서버와 클라이언트에 동일한 기술을 사용하면 클라이언트와 서버간에 HTTP 리소스를 자동으로 공유하므로 이점이 있습니다.

개발자는 사용자 정의 ReactorResourceFactory 또는 JettyResourceFactory 빈을 제공하여 Jetty 및 Reactor Netty의 자원 구성을 대체 할 수 있습니다. 이는 클라이언트와 서버 모두에 적용됩니다.

클라이언트에 대한 선택 사항을 대체하려면 클라이언트 고유의 ClientHttpConnector Bean을 정의하고 클라이언트 구성을 완전히 제어 할 수 있습니다.

WebClient 구성 옵션에 대한 자세한 내용은 Spring Framework 레퍼런스 문서를 참조하십시오.

36.2 WebClient 사용자 정의

WebClient커스터마이제이션을 적용하려는 세 가지 방법에 따라 세 가지 주요 방법 이 있습니다.

가능한 모든 사용자 정의 범위를 좁히려면 자동 구성된 WebClient.Builder를 삽입 한 다음 필요에 따라 해당 메서드를 호출하십시오. WebClient.Builder 인스턴스는 상태 정보입니다. 빌더의 모든 변경 사항은 이후에 작성된 모든 클라이언트에 반영됩니다. 동일한 빌더로 여러 클라이언트를 작성하려는 경우 WebClient.Builder other = builder.clone();을 사용하여 빌더 복제를 고려할 수도 있습니다.

모든 WebClient.Builder인스턴스에 대한 응용 프로그램 차원의 추가 사용자 지정을 수행하려면 WebClientCustomizer Bean을 선언하고 WebClient.Builder를 주입 지점에서 로컬로 변경할 수 있습니다.

마지막으로 원래 API로 되돌아 가서 WebClient.create()를 사용할 수 있습니다. 이 경우 자동 구성 또는 WebClientCustomizer가 적용되지 않습니다.

Last updated