WebClient
1. WebClient
- Spring WebFlux는 HTTP 요청을 수행하기 위한 클라이언트를 포함합니다.
- WebClient는 비동기 및 논블로킹 방식으로 HTTP 요청을 수행할 수 있는 클라이언트입니다.
1.1 HTTP client library
- WebClient는 실제 HTTP 요청을 수행하기 위해 하위 수준의 HTTP 클라이언트 라이브러리가 필요합니다.
- WebClient 자체는 리액티브 프로그래밍 모델을 위한 고수준 API를 제공하지만, 실제 네트워크 통신은 이러한 HTTP 클라이언트 라이브러리를 통해 이루어집니다.
- Spring WebFlux의 WebClient가 기본적으로 지원하는 HTTP 클라이언트 라이브러리들은 다음과 같습니다:
- Reactor Netty
- Spring WebFlux의 기본 HTTP 클라이언트 라이브러리입니다.
- Netty 기반으로 비동기 논블로킹 I/O를 제공합니다.
- WebClient.create()를 호출하면 기본적으로 Reactor Netty 클라이언트가 사용됩니다.
- 예: new ReactorClientHttpConnector(HttpClient.create())
- JDK HttpClient
- Java 11부터 도입된 표준 HTTP 클라이언트입니다.
- 비동기 요청을 지원합니다.
- 예: new JdkClientHttpConnector()
예시
// Reactor Netty 사용 (기본값)
WebClient webClient = WebClient.create();
// 또는 명시적으로 설정
HttpClient httpClient = HttpClient.create(); // Reactor Netty 클라이언트
WebClient webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
// JDK HttpClient 사용
java.net.http.HttpClient jdkHttpClient = java.net.http.HttpClient.newBuilder()
.followRedirects(java.net.http.HttpClient.Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(10))
.build();
WebClient webClient = WebClient.builder()
.clientConnector(new JdkClientHttpConnector(jdkHttpClient))
.build();
- WebClient를 생성할 때 이러한 HTTP 클라이언트 중 하나를 선택하여 설정할 수 있습니다.
- 각 HTTP 클라이언트 라이브러리는 성능 특성, 기능, 설정 옵션이 다르므로 애플리케이션의 요구사항에 맞는 것을 선택할 수 있습니다.
2. Configuration
2.1 WebClient 생성
- WebClient를 생성하는 가장 간단한 방법은 다음의 정적 팩토리 메소드를 사용하는 것입니다.
WebClient.create()
- 더 많은 옵션을 위해
WebClient.builder()를 사용할 수도 있습니다.- uriBuilderFactory: 기본 URL로 사용할 맞춤형 UriBuilderFactory
- defaultUriVariables: URI 템플릿 확장 시 사용할 기본값
- defaultHeader: 모든 요청에 대한 헤더
- defaultCookie: 모든 요청에 대한 쿠키
- defaultRequest: 모든 요청을 커스터마이즈하기 위한 Consumer
- filter: 모든 요청에 대한 클라이언트 필터
- exchangeStrategies: HTTP 메시지 리더/라이터 커스터마이징
- clientConnector: HTTP 클라이언트 라이브러리 설정
- observationRegistry: 관찰성(Observability) 지원을 위한 레지스트리
- observationConvention: 기록된 관찰에서 메타데이터를 추출하기 위한 선택적 커스텀 규칙
WebClient client = WebClient.builder()
.codecs(configurer -> ... )
.build();