WebClient
Last updated
Last updated
Spring WebFlux๋ HTTP ์์ฒญ์ ์ํํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค. WebClient
๋ ๋ฐ์ํ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋์ด ์๊ณ ๋น๋๊ธฐ ๋ฐ Non-Blocking ํต์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Spring 5.0 ๋ถํฐ ์ง์
์ฑ๊ธ ์ค๋ ๋ ๋ฐฉ์
Non-Blocking ๋ฐฉ์, ๋๊ธฐ/๋น๋๊ธฐ ๋ชจ๋ ์ง์
Reactor ๊ธฐ๋ฐ์ Functional API (Mono, Flux)
WebClient๋ ์์ฒญ์ ๋ํ๋ด๊ณ ์ ์กํ๊ฒ ํด์ฃผ๋ ๋น๋ ๋ฐฉ์์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ธ๋ถ API๋ก ์์ฒญ์ ํ ๋ ๋ฆฌ์กํฐ๋ธ ํ์ ์ ์ ์ก๊ณผ ์์ ์ ํฉ๋๋ค.
WebClient๋ ๋๊ธฐ, ๋น๋๊ธฐ ํธ์ถ์ ๋ชจ๋ ์ง์ํฉ๋๋ค. WebClient๋ Non-Blocking ๋ฐฉ์์ผ๋ก, ํธ์ถ๋ ์์คํ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ์ ์ด๊ถ ๋ฐํ์ ์ค์ ์ ๋๊ณ , ๋๊ธฐ/๋น๋๊ธฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ฃผ๋์ง์ ์ค์ ์ ๋ก๋๋ค.
๋๊ธฐ๋ ์์ ๊ฒฐ๊ณผ๊ฐ์ ์ง์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐ๋ฉด, ๋น๋๊ธฐ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ผ๋ฉด ์ด๋ป๊ฒ ํ ์ง์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํด๋ก๋๋ค.
์ถ์ฒ :
WebClient์์ ๊ฐ๋ฅํ ๋น๋๊ธฐ ๋ฐฉ์์ Non-Blocking ๋ฐฉ์์ ๊ฐ์ ํ ์ผ์ ์ํํ๋ฉฐ, ํ์ํ ์์ ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
Blocking ๋ฐฉ์์ RestTemplate๊ณผ Non-Blocking ๋ฐฉ์์ WebClient์ ์ฑ๋ฅ ๋น๊ต
์ถ์ฒ :
๊ทธ๋ํ์ Boot1์ RestTemplate์, Boot2๋ WebClient๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๋์ ์ฌ์ฉ์ ์๊ฐ 1,000๋ช ๋ฏธ๋ง์ผ ๊ฒฝ์ฐ Boot1๊ณผ Boot2 ๋ชจ๋ ๋น์ทํ ์๋ต์๋๋ฅผ ๋ด์ง๋ง, ๋์ ์ฌ์ฉ์ ์๊ฐ ๋์ด๋ ์๋ก ์๋ ์ฐจ์ด๊ฐ ๋ฒ์ด์ง๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
build.gradle
dependency์ ์ ๋ด์ฉ์ ์ถ๊ฐํฉ๋๋ค.
WebClient๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋จ์ create()ํ๋ ๋ฐฉ๋ฒ๊ณผ, option์ ์ฌ๋ฌ๊ฐ์ง ์ถ๊ฐํ ์ ์๋ Builder๋ฅผ ํ์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํฉ๋๋ค.
๋จ์ํ๊ฒ WebClient์ Default Setting์ผ๋ก ์์ฑํ ์ ์๊ณ , ์์ฒญํ URI์ ํจ๊ป ์์ฑํ ์ ์์ต๋๋ค.
Builder๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ๊ฐ์ง ์ต์ ์ ์ถ๊ฐํ์ฌ ์ค์ ํ ์ ์์ต๋๋ค.
Spring Webflux๋ ์ดํ๋ฆฌ์ผ์ด์ ๋ฉ๋ชจ๋ฆฌ ์ด์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ์ฌ์ด์ฆ๋ฅผ Default๋ก 256KB๋ก ์ ํํ๊ณ ์์ต๋๋ค. ์ ์ค์ ์ ํตํด ์ต๋ ๋ฒํผ ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
Connect TimeOut๊ณผ Read TimeOut, Write TimeOut์ ๋ชจ๋ ์ง์ ํด์ HttpClient ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฃผ์ ํ ์ ์์ต๋๋ค.
์ ๋ด์ฉ๋ค์ ์ ์ฉํ์ฌ Config๋ฅผ ํตํด Bean์ผ๋ก ๋ง๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Bean์ผ๋ก ๋ฑ๋กํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ๋น๋ํ ๋ค์ WebClient๋ ํด๋น ์ต์ ์ผ๋ก ๊ณ ์ ๋์ด ์์ต๋๋ค. ํ์ง๋ง WebClient๋ฅผ Default Setting๊ณผ ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด mutate()๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Employee ๊ฐ์ฒด ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ฐ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
ID๋ฅผ ํตํด Employee ๊ฐ์ฒด ํ ๊ฐ๋ฅผ ์กฐํํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
.body(Mono.just(empl), Employee.class)
์ฝ๋๊ฐ ์์ต๋๋ค. ์ด ์ฝ๋๋ empl์ ํ์
์ด Employee๋ผ๋ ํด๋์ค์์ ๋ช
์ํฉ๋๋ค.
๋ง์ฝ, POST ํ ๋ฐ์ body๊ฐ ์๋ค๋ฉด bodyToMono(Void.class)
๋ก ์์ฑํ๋ฉด ๋ฉ๋๋ค.
์์ฒญ ํ ํ์๋ ์๋ต์ ๋ฐ์์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์๋ต์ ๋ฐ์ ๋์๋ ์๋์ ๋ ๊ฐ์ง ๋ฉ์๋ ์ค ์ ์ ํ ๊ฒ์ ์ ํํ๋ฉด ๋ฉ๋๋ค.
retrieve() : body๋ฅผ ๋ฐ์ ๋์ฝ๋ฉํ๋ ๋ฉ์๋
exchange() : ClientResponse๋ฅผ ์ํ๊ฐ๊ณผ ํค๋๋ฅผ ํจ๊ป ๊ฐ์ ธ์ค๋ ๋ฉ์๋
exchange()๋ฅผ ํตํด ์ธ์ธํ ์์ ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ retrieve()๋ฅผ ๊ถ๊ณ ํฉ๋๋ค.
์์ Request ํํธ์์ Mono
๊ฐ์ฒด๋ 0-1๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์ด๊ณ , Flux
๋ 0-N๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์
๋๋ค.
retrieve๋ฅผ ์ฌ์ฉํ ํ์ ๋ฐ์ดํฐ๋ ๋ ๊ฐ์ง ํํ๋ก ๋ฐ์ ์ ์์ต๋๋ค.
status, headers, body๋ฅผ ํฌํจํ๋ ResponseEntity ํ์ ์ผ๋ก ๋ฐ์ต๋๋ค.
body์ ๋ฐ์ดํฐ๋ก๋ง ๋ฐ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
Mono<>, Flux<>๋ Blocking ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ํ๋ฉด .block()
, Non-Blocking ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ํ๋ฉด .subscribe()
๋ฅผ ํตํด callback ํจ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
retrieve๋ 1XX, 2XX, 3XX StatusCode๋ณ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.