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๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.



๋ชฉ์ฐจ ๊ฐ€์ด๋“œ