티스토리 뷰

Spring

[Spring Webflux] WebClient

hyuuny 2024. 5. 8. 16:59

RestTemplate

기존에 사용하던 RestTemplate은 동기 blocking 기반의 webClient이다. 스프링 5.0부터 더이상의 개발은 하지 않고 유지만 하고 있으며, WebClient를 사용하길 권장하고 있다.



WebClient

WebClient는 Non-blocking reactive http 클라이언트이며, thread safe하기 때문에 여러 쓰레드에서 동시에 접근해도 문제가 없다. Reactor Netty, Jetty, apache의 HttpComponent를 이용해서 구현되어 있고, http 호출을 위한 여러 설정들을 메서드 체이닝을 통해 유연하게 설정할 수 있다는 특징이 있다.



WebClientBuilder

WebClientBuilder는 WebClient를 만들면서 필요한 설정들을 제공한다.


  • baseUrl: webClient의 기본 url. 모든 요청의 path에 prefix로 들어간다
  • defaultHeaders: 기본으로 제공되는 헤더 변경
  • defaultCookies: 기본으로 제공되는 쿠키 변경
  • filters: WebHandler와 WebFilter처럼 webClient가 요청을 보내기 전후에 동작하는 filter
  • clientConnector: webClient에서 사용되는 clientConnector 변경
  • codecs: client에의 CodecConfigurer 설정
  • exchangeFunction: http 요청을 수행하는 exchangeFunction을 변경

WebClient 생성

val webClientBuilder = WebClient.builder()
val webClient = WebClient.create()
val webClientWithUrl = WebClient.create("https://hyuuny.tistory.com/") // baseUrl 제공

WebClient는 builder를 직접 호출하거나, create(baseUrl 제공 가능)를 통해서 생성 가능하다.


WebClient 메서드

WebClient의 메서드로는 get, head, post, put, patch, delete, options, method가 있다. post, put, patch의 경우에는 RequestBodyUriSpec을 반환하고, 나머지는 RequestHeadersUriSpec을 반환한다.



RequestBodySpec

RequestBodySpec은 request의 body를 설정할 수 있는 메서드를 제공하며, publisher 또는 BodyInserter를 이용해서 변환할 수 있다.


  • bodyValue: 객체를 받아서 내부적으로 codec을 이용해서 변환

RequestHeadersSpec

  • accept, acceptCharset: Accept 헤더 변경
  • cookie, cookies: 요청의 쿠키 변경
  • header, headers: 요청의 header 변경
  • attribute: webClient의 filter들에 제공되는 attribute 설정
  • httpRequest: HTTP 라이브러리의 요청에 직접 접근할 수 있게 callback 제공

RequestHeadersSpec

RequestHeadersSpec은 실제 요청을 보낼 수 있는 메서드들이 제공된다. retrieve, exchangeToMono, exchangeToFlux를 실행하면 요청을 서버에 전달하고 응답을 받는다.


  • retrieve: ResponseSpec을 반환
  • exchangeToMono: ClientResponse를 인자로 받고 body를 Mono형태로 반환하는 callback
  • exchangeToFlux: ClientResponse를 인자로 받고 body를 Flux형태로 반환하는 callback

UriSpec

uri를 변경할 수 있는 Spec으로써, RequestHeadersUriSpec과 RequestBodyUriSpec에서 구현하고 있다.



ResponseSpec

  • onStatus: response를 확인하고 문제가 발생 한 경우 Mono.error를 반환하여 error 전파
  • bodyToMono, bodyToFlux: response를 mono나 flux로 변환
  • toEntity, toEntityList, toEntityFlux: response를 ResponseEntity로 반환하고 각 각의 body를 하나의 객체 혹은 List나 Flux로 변환
  • toBodiessEntity: response를 ResponseEntity로 변환하고 body는 포함하지 않는다
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함