Spring WebClient์์ bodyToMono()
/ bodyToFlux()
๋ ์๋ต ๋ณธ๋ฌธ์ ํ ๋ฒ๋ง ์๋นํ ์ ์๋ 1ํ์ฑ ์คํธ๋ฆผ์
๋๋ค.
bodyToMono()
๋ฅผ ๋ ๋ฒ ํธ์ถํ๋ฉด โ ๋ ๋ฒ์งธ๋ ๋น ๊ฒฐ๊ณผ ๋๋ ์ค๋ฅClientResponse
๋ฅผ ๋ณต์ ํด๋ body๋ ๊ธฐ๋ณธ๊ฐ(empty) ์ผ๋ก ์ค์ ๋จ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ "๋ฐ์ดํฐ๋ ํ ๋ฒ๋ง ๊ตฌ๋
๊ฐ๋ฅ" ์์น์ ๋ฐ๋ฆ.
โ ์ด๋ฏธ ํ ๋ฒ ์ฝ์ ์คํธ๋ฆผ์ ๋ค๋ฅธ ๊ตฌ๋
์์๊ฒ ์ฌ์ ์ก ๋ถ๊ฐ.
์ฌ๋ก | ์ค๋ช |
---|---|
์๋ต Body ๋ ๋ฒ ์ฝ๊ธฐ ์๋ | โ ์คํจ (ํ ๋ฒ๋ง ์๋น ๊ฐ๋ฅ) |
ํํฐ์์ body ๋ก๊น ํ ์ฌ์ฌ์ฉ | โ body ์์ง๋จ |
ClientResponse ์ฌ์์ฑ | โ ๏ธ body ๋น์ด ์์ (๊ธฐ๋ณธ๊ฐ: empty) |
webClient.post()
.retrieve()
.bodyToMono(String::class.java)
.doOnNext { logger.info("์๋ต ๋ฐ๋: $it") }
.map { objectMapper.readValue<MyDto>(it) }
response.bodyToMono(String::class.java).flatMap { body ->
val parsed = objectMapper.readValue<MyDto>(body)
Mono.just(parsed)
}
.cache()
๋๋ .share()
์ฌ์ฉval cachedBody = response.bodyToMono(String::class.java).cache()
// ์ฌ๋ฌ ๊ตฌ๋
์์๊ฒ ๋์ผํ ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ๋ฅ
์ฃผ์: cache()
๋ ์๋ฌ๋ ์บ์ํ๋ฏ๋ก ์ฃผ์ ํ์.
ResponseEntity
๋ก ๋ฐ๊ธฐwebClient.post()
.retrieve()
.toEntity(String::class.java)
.flatMap { entity ->
val body = entity.body
...
}
// ๋ด์ฉ ๋ฌด์ํ๊ณ ์๋น
response.bodyToMono(Void::class.java)
// ๋๋ Spring 5.2+์ผ ๊ฒฝ์ฐ
response.releaseBody()
response.bodyToMono(String::class.java).flatMap { body ->
val newResponse = response.mutate()
.body(Mono.just(body)) // โ
body ์ฌ์ฃผ์
ํ์
.build()
Mono.just(newResponse)
}
ClientResponse.from()
๋๋.mutate()
๋ก ๋ณต์ ํ ๋ body๋ ๊ธฐ๋ณธ์ ์ผ๋ก empty
๋ฐ๋์.body(...)
๋ก ๋ช ์์ ์ผ๋ก ๋ค์ ์ค์ ํด์ค์ผ ํจ
.doOnNext
์ฌ์ฉ.bodyToMono(Void::class)
ํน์ .releaseBody()
ํธ์ถClientResponse
๋ฅผ ๋ณต์ ํ ๋ ๋ฐ๋์ .body(...)
๋ก ์ฌ์ง์ ํด์ผ ํจํ์ํ๋ค๋ฉด ์ด ํ ํ๋ฆฟ์ Notion ๊ณต์ ์ฉ์ผ๋ก PDF ๋๋ ํ ํ๋ฆฟ ๋งํฌ๋ก ์ ๋ฆฌํด์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ ๋ง์ ์ฃผ์ธ์.