개인 공부를 위해 정리중..
Non-blocking 통신을 위해서는 RestTemplate 대신 WebClient를 사용하자.
WebClient를 사용하는 방법은 간단하게 WebClient.create(), WebClient.create(url) 사용할 수 있지만
여기서는 WebClient Builder에 대해서 살펴보자.
WebClient.builder 에는 아래와 같은 함수들을 이용할 수 있다.
- defaultHeader
- defaultCookie
- uriBuilderFactory
- defaultUriVariables
- defaultRequest
- filter
- exchangeStrategies
- clientConnector
1) defaultHeader, defaultCookie 는 함수 이름만으로 예상가능할 듯하다.
defaultHeader(HttpHeaders.USER_AGENT, "Spring 5 WebClient")
물론 Header와 Cookie는 WebClient를 사용하는 시점에 추가할 수 있다.
2) uriBuilderFactory 도 예상가능하다. -> 접근하려는 URI를 지정하는데 사용한다.
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(BASE_URL);
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.URI_COMPONENT);
uriBuilderFactory(factory)
3) defaultUriVariables은 URLTemplate에 사용될 변수와 값을 지정한다.
즉 uriBuilderFactory에서 생성된 uribuilder가 추후 uri 문자열를 생성할 때 URLTemplate에 적용할 변수와 값 지정
static final String BASE_URL = "http://localhost:8080/uribuilder/{pathvar} test?q={paramvalue}";
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(BASE_URL);
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.URI_COMPONENT);
Map<String, Object> defaultUriVariables = new HashMap<>();
defaultUriVariables.put("pathvar", "패스변수");
defaultUriVariables.put("paramvalue", "파리미터값");
uriBuilderFactory.setDefaultUriVariables(defaultUriVariables);
4) defaultRequest
5) filter 요청, 응답에 대한 데이터를 조작할 수 있다.
요청의 User-Agent 헤더에 내용을 추가하는 예)
WebClient.builder().filter(ExchangeFilterFunction.ofResponseProcessor(
clientRequest -> {
clientRequest.headers()
.header(HttpHeaders.USER_AGENT)
.add("Added By Filter");
return Mono.just(clientRequest);
}
));
6) exchangeStrategies은 ExchangeStrategies를 지정해서 Codec (인코딩/디코딩) 을 설정한다.
코덱의 최대 버퍼 사이즈 설정
ExchangeStrategies strategies =
ExchangeStrategies.builder()
.codecs(configurer ->
{
configurer
.defaultCodecs()
.maxInMemorySize(2 * 1024 * 1024);
}
)
.build();
커스텀 Encoder와 Decoder를 생성해서 지정할 수도 있다.
7) clientConnector은 Http 클라이언트 라이브러리를 설정한다. (Timeout, SSL등)
HttpClient httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000);
WebClient webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();