0. WebClient란?
- WebFlux에서 사용하는 Non-Blocking Http Client
- ✅ Reactor 기반 동작
- ✅ Mono / Flux 형태로 응답 처리
- ✅ Streaming 지원
- ➡️ Thread나 동시성 처리를 직접 관리 안함
- ➡️ Server측과 동일한 Codec 체계를 사용하여 Request/Response를 Encode/Decode 가능
1. retrieve()
- 응답을 추출할 때 사용
예시) 전체 ResponseEntity 받기
더보기
WebClient client = WebClient.create("https://example.org");
Mono<ResponseEntity<Person>> result =
client.get()
.uri("/persons/{id}", id)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.toEntity(Person.class);
예시) Body만 받기
더보기
Mono<Person> result =
client.get()
.uri("/persons/{id}", id)
.retrieve()
.bodyToMono(Person.class);
예시) 여러 데이터를 Stream으로 받기
더보기
Flux<Quote> result =
client.get()
.uri("/quotes")
.accept(MediaType.TEXT_EVENT_STREAM)
.retrieve()
.bodyToFlux(Quote.class);
Error 처리
- 기본적으로 4XX, 5XX는 WebClientResponseException으로 처리됨
- onStatus()로 직접 핸들링 가능
예시) onStatus()
더보기
Mono<Person> result =
client.get()
.uri("/persons/{id}", id)
.retrieve()
.onStatus(
HttpStatusCode::is4xxClientError,
response -> ...
)
.onStatus(
HttpStatusCode::is5xxServerError,
response -> ...
)
.bodyToMono(Person.class);
2. Exchange
- Response를 먼저 직접 확인할 수 있음
- ✅ retrieve()보다 더 Response를 세밀하게 제어하고 싶을 때 사용
예시) Status에 따라 Body 처리 방식 결정
더보기
Mono<Person> result =
client.get()
.uri("/persons/1")
.exchangeToMono(response -> {
if (response.statusCode().equals(HttpStatus.OK)) {
return response.bodyToMono(Person.class);
}
return response.createError();
});
exchangeToMono vs exchangeToFlux
| 방식 | 특징 | 사용 |
| retrieve() | 간단하게 Body/Entity 추출 | 일반적인 HTTP 호출 |
| exchangeToMono() | Status/Header/Body를 직접 보고 처리 | 복잡한 Response 처리 |
| exchangeToFlux() | 위와 동일하지만 여러 데이터 반환 | Streaming / Flux |
3. Request Body
- Request Body에도 Mono / Flux를 넣을 수 있음
예시) Mono를 Body로 전송
더보기
Mono<Person> personMono = ...;
Mono<Void> result =
client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.body(personMono, Person.class)
.retrieve()
.bodyToMono(Void.class);
예시) Flux를 Body로 전송
더보기
Flux<Person> personFlux = ...;
Mono<Void> result =
client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_STREAM_JSON)
.body(personFlux, Person.class)
.retrieve()
.bodyToMono(Void.class);
bodyValue()
- 이미 실제 객체를 가지고 있는 경우 사용
예시) bodyValue()
더보기
Person person = ...;
Mono<Void> result =
client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(person)
.retrieve()
.bodyToMono(Void.class);
Form Data
Multipart Data
PartEvent
'Spring' 카테고리의 다른 글
| [Spring WebFlux] 3. DispatcherHandler (0) | 2026.08.19 |
|---|---|
| [Spring WebFlux] 2. Reactive Core (0) | 2026.08.19 |
| [Spring WebFlux] 1. Overview (0) | 2026.08.18 |