본문 바로가기

IT for developer/Spring

WebClient Builder

개인 공부를 위해 정리중..

 

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();