Spring

[Spring WebClient] 1. Request / Response

noahkim_ 2026. 8. 19. 20:39

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