Loading...
Spring Framework Reference Documentation 7.0.2의 Synchronous Use의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
WebClient는 결과를 위해 마지막에 blocking을 수행함으로써 동기식 스타일로 사용할 수 있습니다:
1Person person = client.get().uri("/person/{id}", i).retrieve() 2 .bodyToMono(Person.class) 3 .block(); 4 5List<Person> persons = client.get().uri("/persons").retrieve() 6 .bodyToFlux(Person.class) 7 .collectList() 8 .block();
1val person = runBlocking { 2 client.get().uri("/person/{id}", i).retrieve() 3 .awaitBody<Person>() 4} 5 6val persons = runBlocking { 7 client.get().uri("/persons").retrieve() 8 .bodyToFlow<Person>() 9 .toList() 10}
그러나 여러 호출을 수행해야 하는 경우, 각 response마다 개별적으로 blocking을 하는 것을 피하고, 대신 결합된 결과를 기다리는 것이 더 효율적입니다:
1Mono<Person> personMono = client.get().uri("/person/{id}", personId) 2 .retrieve().bodyToMono(Person.class); 3 4Mono<List<Hobby>> hobbiesMono = client.get().uri("/person/{id}/hobbies", personId) 5 .retrieve().bodyToFlux(Hobby.class).collectList(); 6 7Map<String, Object> data = Mono.zip(personMono, hobbiesMono, (person, hobbies) -> { 8 Map<String, String> map = new LinkedHashMap<>(); 9 map.put("person", person); 10 map.put("hobbies", hobbies); 11 return map; 12 }) 13 .block();
1val data = runBlocking { 2 val personDeferred = async { 3 client.get().uri("/person/{id}", personId) 4 .retrieve().awaitBody<Person>() 5 } 6 7 val hobbiesDeferred = async { 8 client.get().uri("/person/{id}/hobbies", personId) 9 .retrieve().bodyToFlow<Hobby>().toList() 10 } 11 12 mapOf("person" to personDeferred.await(), "hobbies" to hobbiesDeferred.await()) 13}
위의 내용은 단지 하나의 예시일 뿐입니다. 많은 원격 호출을 수행하는 리액티브 파이프라인을 구성하기 위한 다른 패턴과 연산자가 많이 있으며, 잠재적으로 일부는 중첩되고, 서로 의존적이지만, 마지막까지 결코 blocking을 하지 않습니다.
Flux또는Mono를 사용할 때, Spring MVC 또는 Spring WebFlux 컨트롤러에서 blocking을 해야 할 필요는 전혀 없습니다.<br>단순히 컨트롤러 메서드에서 결과 리액티브 타입을 반환하면 됩니다. 동일한 원칙이 Kotlin Coroutines와 Spring WebFlux에도<br>적용되며, 컨트롤러 메서드에서 서스펜딩 함수를 사용하거나Flow를 반환하기만 하면 됩니다 .
Context
Testing