2.3. exchange()

exchange() ๋ฉ”์„œ๋“œ๋Š” retrieve ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” retrieve() ์˜ˆ์ œ์™€ ๊ฐ™์ง€๋งŒ, ClientResponse์— ์ ‘๊ทผํ•œ๋‹ค.

Java:

Mono<Person> result = client.get()
        .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
        .exchange()
        .flatMap(response -> response.bodyToMono(Person.class));

Kotlin:

val result = client.get()
        .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
        .awaitExchange()
        .awaitBody<Person>()

์ด ๋ ˆ๋ฒจ์—์„œ, ์™„์ „ํ•œ ResponseEntity๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Java:

Mono<ResponseEntity<Person>> result = client.get()
        .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
        .exchange()
        .flatMap(response -> response.toEntity(Person.class));

Kotlin:

val result = client.get()
        .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
        .awaitExchange()
        .toEntity<Person>()

exchange()๋Š” (retrieve()์™€ ๋‹ค๋ฅด๊ฒŒ) 4xx, 5xx ์‘๋‹ต์— ๋Œ€ํ•œ ์ž๋™์ ์ธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ์—†๋‹ค. ์ง์ ‘ ์ƒํƒœ ์ฝ”๋“œ(status code)๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ์ด์–ด์ง€๋Š” ๋™์ž‘์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

retrieve()์™€ ๋‹ค๋ฅด๊ฒŒ exchange()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‹œ๋‚˜๋ฆฌ์˜ค(์„ฑ๊ณต, ์˜ค๋ฅ˜, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ ๋“ฑ)์— ๊ด€๊ณ„์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ง์ ‘ ์‘๋‹ต ์ฝ˜ํ…์ธ (response content)๋ฅผ ์†Œ๋น„ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ClientResponse javadoc์— ๋ณธ๋ฌธ(body)๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ต์…˜์ด ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค. exchange()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‘๋‹ต ์ƒํƒœ์™€ ํ—ค๋”๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ์‘๋‹ต์„ ์†Œ๋น„ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด, ์ผ๋ฐ˜์ ์œผ๋กœ retrieve()๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


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