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)์ด ๋ฐ์ํ ์ ์๋ค.ClientResponsejavadoc์ ๋ณธ๋ฌธ(body)๋ฅผ ์๋นํ ์ ์๋ ๋ชจ๋ ์ต์ ์ด ์ค๋ช ๋์ด ์๋ค.exchange()๋ฅผ ์ฌ์ฉํด์ ์๋ต ์ํ์ ํค๋๋ฅผ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ต์ ์๋นํด์ผ ํ๋ ์ํฉ์ด ์๋๋ผ๋ฉด, ์ผ๋ฐ์ ์ผ๋กretrieve()๋ฅผ ์ฐ๋ ๊ฒ์ด ์ข๋ค.
๋ชฉ์ฐจ ๊ฐ์ด๋