봉봉의 개인 블로그

2019-08-01 [카테고리 미분류](WebClient) 본문

카테고리 없음

2019-08-01 [카테고리 미분류](WebClient)

봉봉이네 2019. 8. 1. 17:18

WebClient

Spring 5 와 Spring boot 2.0 부터 AsyncRestTemplate 가  deprecated 되었다. 그래서 비동기식으로 요청을 하려면 WebClient를 이용해야 한다.

RestTemplate

  • RestTemplate 는 WebClient보다 이전에 나왔다.
  • RestTemplate는 동기식이며, response가 올 때까지 다음 행동으로 넘어갈 수 없다.
  • RestTemplate는 곧 deprecated 될것이다..

WebClient

WebClient는 웹요청을 하는데 있어 출입문 역할을 하는 인터페이스이다.

Spring Web Reactive 모듈에 포함되어 있으며, RestTemplate를 대체한다.

 

설치 및 의존성 설정

  • dependencies 추가를 해줘야 한다.

WebClient instance 생성

프로젝트 소스코드에서는 builder패턴을 사용하여 인스턴스를 만든다.

WebClient client = WebClient
	.builder()
    	.baseUrl("http://localhost:8080")
	.defaultCookie("쿠키키","쿠키값")
	.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
	.build();

Request 요청하기

1. HTTP 메소드를 정한다.

WebClient.UriSpec<WebClient.RequestBodySpec> req = client.post();

2. 두번째 uri API를 제공. String 포맷 혹은 java.net.URL 포맷으로 넘긴다.

WebClient.RequestBodySpec uri = client
                             .post()
                             .uri("/search");

3. 필요하다면 Request에 body, content-type,length, cookie, header 등을 포함할 수 있다.

WebClient.RequestHeadersSpec<?> req2 = client.post().
                                             .uri("/search")
                                             .body(BodyInserters.fromObejct("data"));

 

아예 다르게 접근할 수도 있다. 원하는 uri를 직접 만들어 요청하는 방식이다.

private final WebClient.RequestHeaderUriSpec<?> baseSpec;

baseSpec = Webclient.builder().baseUrl("주소").build().get();

// baseSpec에 원하는 파라미터를 추가로 붙여서 요청한다. 
baseSpec.uri(builder -> builder.path("/")
                        .queryParam("이름","값")
                        .builder()
            ).retrieve() // Response를 받아옴.

Response 받아오기

이 과정에는 두 방법이 있다.

  • exchange는 ClientResponse를 상태값 그리고 헤더와 함께 가져오는 반면에,
  • retrieve 는 body를 바로 가져온다.
String response = req.exchange().block().bodyToMono(String.class).block();

String response2 = req2.retrieve().bodyToMono(String.class).block();

여기서 bodyToMono 는 가져온 body를 Reactor의 Mono 객체로 바꿔준다. Mono 객체는 0-1개의 결과를 처리하는 객체이고, 반면 Flux 는 0-N개인 결과를 처리하는 객체!

위에서 block 을 사용하면 Rest Template처럼 동기식으로 사용할 수 있다고 했다.

block을 Mono에 사용하여, response와 함께 전송된 실제 데이터를 구독하고 얻어 올 수 있다!

 

 

 

-출처 : https://junebuug.github.io/2019-02-11/resttemplate-vs-webclient

Comments