kok202
Spring boot's RestTemplate, WebClient

2019. 4. 21. 17:05[정리] 기능별 개념 정리/스프링 부트

Spring 에서 Remote REST Service를 호출 할 일이 있을 때 사용한다.

RestTemplate instance 는 보통 사용하기 전에 Customizing을한다.

 

 

RestTemplate 을 customizing 하는 대표적인 3가지 방법

방법 1. RestTemplateBuilder 사용하기

restTemplate = restTemplateBuilder.build();

방법 2. RestTemplateCustomizer 만들어 사용하기 -> RestTemplate을 Customize 하면 자동으로 RestTemplateBuilder에 추가된다.

static class ProxyCustomizer implements RestTemplateCustomizer {
	@Override
	public void customize(RestTemplate restTemplate) {
		HttpHost proxy = new HttpHost("proxy.example.com");
		HttpClient httpClient = 
				HttpClientBuilder
				.create()
				.setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
					@Override
					public HttpHost determineProxy(
							HttpHost target,
							HttpRequest request, 
							HttpContext context)
							throws HttpException {
						if (target.getHostName().equals("192.168.0.5"))
							return null;
						return super.determineProxy(target, request, context);
					}
				}).build();
		restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
	}

}

방법 3. 자체적인 RestTemplateBuilder 를 만들기 (잘 안쓰임)

 

 

 

 

 

RestTemplate의 주요 메소드

1. getForObject()

2. postForObject()
3. put()

4. delete()

5. exchange() : Header를 setting 해서 request를 보내고 ResponseEntity<> 로 결과를 받는다.

 

 

 

 

 

RestTemplate vs AsyncRestTemplate vs WebClient

1. RestTemplate은 동기 처리이기 때문에 block이 된다.

2. 비동기 처리를 구현하고 싶으면 AsyncRestTemplate을 사용하면된다.

-> 지금은 Reactive 구조가 나오면서 deprecated 됬다.

3. 비동기 처리 이상의 Reative 한 구조를 원한다면 WebClient를 사용하면 된다.

-> Reactive이기 때문에 Return type 이 Mono<> 또는 Flux<> 이다.

-> Reactive이기 때문에 subscribe 하기전에는 flow 가 발생하지 않는다.

 

 

 

 

 

WebClient

WebClient는 3가지 방법으로 Customizer할 수 있다.

1. WebClient.Builder 사용하기 (WebClient.Builder는 싱글톤이므로 커스터마이징 하고 싶으면 빌더를 clone 해서 사용해라.)

2. WebClientCustomizer 만들어 사용하기

3. WebClient.create() 사용하기

 

 

 

 

 

WebClient 주요 사용법

WebClient webClient = webClientBuilder
                            .baseUrl("https://localhost:9999")
                            .build();
                            
Mono<User> userMono = webClient
                            .get()
                            .url("/user/123456789")
                            .retrieve()
                            .bodyToMono(MyEntity.class);
                            
myEntityMono.doOnSuccess(myEntity -> {
    System.out.println(MyEntity.toString());
}).subscribe();