2.6. Synchronous Use
WebClient๋ ๋ง์ง๋ง์ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋กํนํ์ฌ ๋๊ธฐ์(synchronous) ์คํ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค:
Java:
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();
Kotlin:
val person = runBlocking {
client.get().uri("/person/{id}", i).retrieve()
.awaitBody<Person>()
}
val persons = runBlocking {
client.get().uri("/persons").retrieve()
.bodyToFlow<Person>()
.toList()
}
ํ์ง๋ง ์ฌ๋ฌ ๋ฒ์ ํธ์ถ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๊ฐ ์๋ต์ ๊ฐ๋ณ์ ์ผ๋ก ๋ธ๋กํนํ์ง ์๊ณ ๊ฒฐํฉ๋ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ค:
Java:
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();
Kotlin:
val data = runBlocking {
val personDeferred = async {
client.get().uri("/person/{id}", personId)
.retrieve().awaitBody<Person>()
}
val hobbiesDeferred = async {
client.get().uri("/person/{id}/hobbies", personId)
.retrieve().bodyToFlow<Hobby>().toList()
}
mapOf("person" to personDeferred.await(), "hobbies" to hobbiesDeferred.await())
}
์์ ์ฝ๋๋ ๋จ์ง ์์์ ๋ถ๊ณผํ๋ค. ๋๋ ์๊ฒฉ ํธ์ถ, ์ผ๋ถ ์ค์ฒฉ๋๊ณ ์ํธ ์์กด์ ์ด๋ฉด์ ํธ์ถ์ด ๋๋ ๋๊น์ง ๋ธ๋กํนํ์ง ์๋ ๋ฆฌ์กํฐ๋ธ ํ์ดํ๋ผ์ธ์ ๋ง๋๋ ์๋ง์ ํจํด๊ณผ ์ฐ์ฐ์๊ฐ ์๋ค.
Flux๋๋Mono๋ฅผ ์ฌ์ฉํ๋ฉด, ์คํ๋ง MVC ๋๋ ์คํ๋ง ์นํ๋ญ์ค ์ปจํธ๋กค๋ฌ์์ ์ฐจ๋จํ ํ์๊ฐ ์๋ค. ๋จ์ง ์ปจํธ๋กค๋ฌ ๋ฉ์๋์์ ๋ฆฌ์กํฐ๋ธ ํ์ ์ ๋ฆฌํดํ๋ฉด ๋๋ค. ์ฝํ๋ฆฐ ์ฝ๋ฃจํด๊ณผ ์คํ๋ง ์นํ๋ญ์ค์์๋ ๋์ผํ ์์น์ด ์ ์ฉ๋๋ค. ์ปจํธ๋กค๋ฌ ํจ์์์ ์ผ์์ค์ง(suspend) ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋Flow๋ฅผ ๋ฐํํ๋ฉด ๋๋ค.
๋ชฉ์ฐจ ๊ฐ์ด๋