WebClient은 결과를 기다리기 위해 끝에서 Blocking 하는 동기식으로 사용될 수 있습니다.
Person person = client.get().uri("/person/{id}", i).retrieve()
.bodyToMono(Person.class)
.block();
List<Person> persons = client.get().uri("/persons").retrieve()
.bodyToFlux(Person.class)
.collectList()
.block();
그러나 여러 호출이 필요한 경우에는 각 응답마다 Blocking 하는 것을 피하는 것이 더 효율적입니다.
대신 결합된 결과를 기다릴 수 있습니다.
Mono<Person> personMono = client.get().uri("/person/{id}", personId)
.retrieve().bodyToMono(Person.class);
Mono<List<Hobby>> hobbiesMono = client.get().uri("/person/{id}/hobbies", personId)
.retrieve().bodyToFlux(Hobby.class).collectList();
Map<String, Object> data = Mono.zip(personMono, hobbiesMono, (person, hobbies) -> {
Map<String, String> map = new LinkedHashMap<>();
map.put("person", person);
map.put("hobbies", hobbies);
return map;
})
.block();
위는 단지 한 예시에 불과합니다. 여러 원격 호출을 수행하는 반응적인 파이프라인을 구성하는 패턴과 연산자가 많이 있으며, 일부는 중첩되고 서로 의존하는 경우가 있으며, 최종적으로 끝까지 블로킹되지 않습니다.
Flux 또는 Mono를 사용하면 Spring MVC 또는 Spring WebFlux 컨트롤러에서 블로킹하지 않아도 됩니다. 컨트롤러 메서드에서 결과를 반응형 유형으로 반환하면 됩니다. Kotlin Coroutines와 Spring WebFlux에도 동일한 원칙이 적용됩니다. 컨트롤러 메서드에서는 suspending function을 사용하거나 Flow를 반환하면 됩니다.
'Spring > WebClient' 카테고리의 다른 글
[WebClient] WebClient Bean 구성 (0) | 2024.03.28 |
---|---|
[WebClient] Context (0) | 2024.03.28 |
[WebClient] Attributes (0) | 2024.03.28 |
[WebClient] Filter (0) | 2024.03.28 |
[WebClient] RequestBody (0) | 2024.03.28 |