Spring WebClient는 Spring WebFlux에서 제공하는 비동기 및 논블로킹 HTTP 클라이언트로, 다른 서비스나 API와 통신할 때 사용됩니다. 이전에 사용되던 RestTemplate의 대안이며, 리액티브 프로그래밍을 지원하여 더 나은 성능과 유연성을 제공합니다.
---
1. WebClient 특징
비동기/논블로킹: 요청과 응답이 블로킹 없이 처리됩니다.
리액티브 스트림 지원: Mono와 Flux를 반환하여 리액티브 방식으로 데이터를 처리합니다.
RestTemplate의 대안: Spring 5 이상에서는 WebClient를 추천합니다.
동기식 호출 가능: 원한다면 동기식으로도 호출할 수 있습니다.
---
2. WebClient 생성
WebClient는 크게 두 가지 방식으로 생성할 수 있습니다:
1. 빌더 사용
2. 전역 WebClient 생성
(1) WebClient.builder() 사용
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
(2) 전역 WebClient 인스턴스
@Configuration 클래스를 사용하여 공통 설정을 제공합니다:
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient(WebClient.Builder builder) {
return builder
.baseUrl("https://api.example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
}
---
3. 요청 예제
WebClient를 이용하여 GET, POST, PUT, DELETE 요청을 처리하는 방법입니다.
(1) GET 요청
WebClient webClient = WebClient.create("https://api.example.com");
Mono<String> response = webClient.get()
.uri("/resource")
.retrieve()
.bodyToMono(String.class);
response.subscribe(System.out::println);
(2) POST 요청
Mono<String> response = webClient.post()
.uri("/create")
.bodyValue(new MyRequestObject("data"))
.retrieve()
.bodyToMono(String.class);
response.subscribe(System.out::println);
(3) 예외 처리
onStatus를 사용하여 응답 상태에 따라 예외를 처리할 수 있습니다:
Mono<String> response = webClient.get()
.uri("/resource")
.retrieve()
.onStatus(HttpStatus::is4xxClientError,
clientResponse -> Mono.error(new RuntimeException("Client error")))
.onStatus(HttpStatus::is5xxServerError,
clientResponse -> Mono.error(new RuntimeException("Server error")))
.bodyToMono(String.class);
---
4. 동기식 호출
Spring WebClient는 기본적으로 비동기 방식이지만, 필요하면 동기식 호출도 가능합니다:
String result = webClient.get()
.uri("/resource")
.retrieve()
.bodyToMono(String.class)
.block(); // 동기식으로 변환
---
5. WebClient 장점
1. 효율적 자원 사용: 논블로킹 I/O로 인해 동시 처리 능력이 향상됩니다.
2. 확장성: 리액티브 스트림을 활용해 대규모 트래픽에도 대응 가능합니다.
3. 유연성: 다양한 HTTP 요청/응답을 쉽게 구성할 수 있습니다.
---
6. 실전 예제
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
public class WebClientExample {
public static void main(String[] args) {
WebClient webClient = WebClient.create("https://jsonplaceholder.typicode.com");
Mono<String> response = webClient.get()
.uri("/posts/1")
.retrieve()
.bodyToMono(String.class);
response.subscribe(System.out::println); // 비동기적으로 결과 출력
}
}
---
Tip: WebClient는 리액티브 프로그래밍의 기본 개념인 Mono(단일값)와 Flux(다중값)를 활용하므로, 리액티브 스트림에 대한 이해가 있으면 더 효과적으로 사용할 수 있습니다.