Spring WebClient
Spring 5.0부터 RestTemplate가 향후 deprecated될 예정이고, 대안으로 WebClient가 등장해 사용을 권고하고 있다.
기존의 동기 API를 제공할 뿐 아니라 Non-Blocking 및 비동기 접근 방식을 지원해서 효율적인 통신이 가능하다.
요청을 나타내고 전송하게 하는 Builder 방식의 인터페이스를 사용한다.
내부적으로 Netty를 사용하고 있기 때문에 event loop 방식으로 동작하고, Reactive Type인 Mono, Flux를 return하는 HTTP client이다.
WebClient의 특징
- Non-Blocking I/O
- Reactive Streams back pressure
- Functional Style
- Synchronous and asynchronous interactions
- Streaming up to or streaming down from a server
- JSON, XML을 쉽게 응답받음
→ Reactive 환경과 MSA를 생각한다면 적극 권장된다.
WebClient를 생성하는 방법
- 단순하게 create()
- 옵션을 추가한 build()
WebClient 생성 시 사용 가능한 옵션
- uriBuilderFactory : base URL을 커스텀할 수 있다.
- default Header : 모든 요청의 헤더를 설정할 수 있다.
- default Cookie : 모든 요청의 쿠키를 설정할 수 있다.
- default Request : 모든 요청을 커스텀할 수 있다.
- filter : 모든 요청의 클라이언트 필터를 설정할 수 있다.
- exchangeStrategies : HTTP 메시지 Reader, Writer를 커스텀할 수 있다.
- clientConnector : HTTP 클라이언트 라이브러리를 세팅할 수 있다.
WebClient를 사용할 때 계속 만들어서 사용하면 시간이 오래 걸리므로, 모든 요청에 공통으로 들어가야 할 Header, Cookie가 있다면 @Configuration, @Bean을 이용하여 static factory를 통해 생성하는 것이 좋다.
WebClient에서 요청 후 데이터를 처리하는 메소드
- retrieve() : body를 받아 디코딩하는 메소드이다.
- exchange() : ClientResponse를 상태값, 헤더와 함께 가져오는 메소드이다. → exchange()를 통해 세세한 컨트롤이 가능하지만, 모든 처리를 직접 해야 하므로 메모리 누수 가능성이 있다. 따라서 retrieve() 사용이 권장된다.
- mutate() : WebClient는 immutable하기 때문에, 설정을 바꾸려면 mutate()를 사용해야 한다.
retrieve() 이후 데이터를 받는 메소드
- toEntity() : status, headers, body를 포함하는 ResponseEntity 타입으로 데이터를 받을 수 있다.
- bodyToMono(), bodyToFlux() : body의 데이터만 받을 수 있다.
'Spring WebFlux' 카테고리의 다른 글
[Spring WebFlux] Spring WebFlux (0) | 2025.02.27 |
---|---|
[Spring WebFlux] Reactive Streams (0) | 2025.02.26 |
[Spring WebFlux] Reactive Programming과 Design Pattern (0) | 2025.02.25 |