Spring/Spring WebFlux
Reactor, Spring WebFlux์ ๊ธฐ์ด ๊ฐ๋
์ ๊ผผ๊ผผํ๊ฒ ๋ค์ง๊ณ ์ "์คํ๋ง์ผ๋ก ์์ํ๋ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ" ์ฑ
์ ์ ๋
ํ๊ณ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค. 1. ๋ฆฌ์กํฐ๋ธ ์์คํ
์ด๋?๋ฆฌ์กํฐ๋ธ ์์คํ
= ๋ฐ์์ ์ํ๋ ์์คํ
๐ ๋น๋๊ธฐ ๋ฉ์์ง ๊ธฐ๋ฐ์ ํต์ ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฆ๊ฐ์ ์ผ๋ก ์๋ตํจ์ผ๋ก์จ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๋ ๊ฒ์ ์๋ฏธโณ๏ธ ํน์ง์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์คํํ ๋์์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ช
์ํ์ง ์๊ณ , ๋ชฉํ๋ง ์ ์ธ์ฌ๋ฌ ๊ฐ์ง ๋์์ ๊ฐ๊ฐ ๋ณ๋์ ์ฝ๋๋ก ๋ถ๋ฆฌํ์ง ์๊ณ , ๊ฐ ๋์์ ๋ํด์ ๋ฉ์๋ ์ฒด์ธ์ ํ์ฑํด ํ ๋ฌธ์ฅ์ผ๋ก ๋ ์ฝ๋๋ก ๊ตฌ์ฑData streams์ propagation of change๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ด๊ฒ์ ๋ณํํ๋ ์ด๋ฒคํธ๋ก ๋ด์ด๋ฒคํธ๋ฅผ ๋ฐ์ํค๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์์ ์ผ๋ก ์ ๋ฌ ๐ท ๋ช
๋ นํ ํ๋ก..
Spring/Spring WebFlux
flatMapManyflatMapManyMono์์ ์ฌ๋ฌ ๊ฐ ์์๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ ๐ Mono์์ ๋ฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์๋ก ๋ณํํ์ฌ Flux๋ก ์ฒ๋ฆฌํ ๋ ์ ์ฉ fromIterableIterable ํ์
์ ๋ฐ์ดํฐ(list, set, map ๋ฑ์ ์ปฌ๋ ์
)๋ฅผ Flux๋ก ๋ณํ ๐ ์ปฌ๋ ์
๋ด์ ์์๋ค์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ map, mapNotNullmap์ onNext ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์๋๋ก ์ ๋ฌ Flux.range(1, 5) .map(value -> value * 2) .doOnNext(value -> { log.info("doOnNext: " + value); }) .subscribe();โmapNotNull์ ๋ณ๊ฒฝ๋ ๊ฐ์ด nu..
Spring/Spring WebFlux
Webflux๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค flatMap๊ณผ map์ด ํญ์ ํท๊ฐ๋ฆฌ๋ฏ๋ก ์ ๋ฆฌ. ๋ ๋ฉ์๋๋ Reactive Stream API ์ผ๋ถ๋ก Reactor ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Mono์ Flux์์ ์ฌ์ฉ๋๋ฉฐ ๋น๋๊ธฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ญํ ์ ์ํํ๋ค. ๋จ, flatMap์ด ๋น๋๊ธฐ ์์
์ ๋ ์ ํฉ ! flatMap()์
๋ ฅ ์คํธ๋ฆผ์ ๊ฐ ์์์ ๋ํด ๋น๋๊ธฐ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉ ๐ 1:N ๋ณํ์๋ณธ ์์๋ฅผ ๋ณํํ์ฌ ์๋ก์ด Mono ๋๋ Flux ๋ฐํ๋ฐํ๋ ์คํธ๋ฆผ์ flatten(ํํํ)๋์ด ๋จ์ผ Mono ๋๋ Flux๋ก ํฉ์ณ์ง@GetMapping("/user/{id}")public Mono getUser(@PathVariable String id) { return userRepository.findById(id) // ret..
Spring/Spring WebFlux
Reactive Programmingโณ๏ธ ์ ํต์ ์ธ ์ฝ๋ฐฑ ๊ธฐ๋ฐ API๋ Future์ ๊ฐ์ JDK์ ๋น๋๊ธฐ ์ฝ๋ ์์ฑ ๋ฐฉ์์ ๋นํด ๋ ์ ์ฐํ๊ณ ํจ์จ์ 1. ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ฐ์ํ : ๋น๋๊ธฐ ์์
์ ์คํธ๋ฆผ์ ํํ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ๋ฐ์ดํฐ์ ํ๋ฆ์ ํตํด ๊ฐ ๋จ๊ณ๋ฅผ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ ์ฆ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ2. ์ ์ธ์ API ์ ๊ณต : Reactor, RxJava์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ map, filter, reduce์ ๊ฐ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ ๋ณํํ๊ณ ์กฐ์ํ๋ ๊ณผ์ ์ ๊ฐ๊ฒฐํ๊ฒ ํํ3. backPressure ์ง์ : ๋ฐ์ดํฐ ์๋น์๊ฐ ๋ฐ์ดํฐ ์์ฐ์์ ์๋๋ฅผ ์ ์ดํ ์ ์๋๋ก ํจ 4. ๋ณต์ก์ฑ ๊ฐ์์ ๊ฐ๋
์ฑ ํฅ์ : ์ฐ์ฐ์ ์ฒด์ด๋์ ํตํด ์ฝ๋์ ๊ฐ๋
์ฑ ๋์ด๊ณ ๊ฐ ๋จ๊ณ์ ์์
์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐ์๊ฐ..
Spring/Spring WebFlux
ํ์์ IoT๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด WebFlux๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.WebFlux์ ๋ํด ์๊ฒ๋ง ์๊ณ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒ ๊ธฐํ์ ๊ณต๋ถํด๋ณด๊ธฐ๋ก ํ๋ค. โด๏ธ Sync(๋๊ธฐ)์ Async(๋น๋๊ธฐ)๐ถ Sync : ํด๋ผ์ด์ธํธ์์ ๋ฉ์๋ ํธ์ถ → ๋ฉ์๋ ์ ๊ณตํ๋ ๊ณณ์์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ํํด ๊ฒฐ๊ณผ๊ฐ์ด ๊ฒฐ์ ๋๋ฉด ๊ทธ๋ ๋ฐํ ๐ ์์ฒญํ ์์
์ ๋ํด ์๋ฃ ์ฌ๋ถ๋ฅผ ์ ๊ฒฝ ์จ์ ์์
์ ์์ฐจ์ ์ผ๋ก ์ํํ ์ง ์๋์ง ๊ฒฐ์ ๐ถ Async : ๊ฒฐ๊ณผ๊ฐ์ด ๊ฒฐ์ ๋๊ธฐ ์ ์ ์ผ๋จ ๋ฐํ (์์ ๋ณด์ฅ X)๐ ์์ฒญํ ์์
์ ๋ํด ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ์ง์ง ์๊ณ ์์ ์ ๋ค์ ์์
์ ๊ทธ๋๋ก ์ํ โด๏ธ Blocking๊ณผ Non-Blocking๐ท Blocking : ์์ฒญํ ์์
์ด ๋๋ ๋๊น์ง ๋ค๋ฅธ ์์
ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆผ๐ท Non-Blocking : ์..
Spring/Spring WebFlux
Spring WebFlux๋ Reactive Stream API๋ฅผ ์ฌ์ฉํ์ฌ non-blocking, asynchronous๋ฅผ ์ง์ํ๋ ๋น๋๊ธฐ ์คํ๋ง ์น ํ๋ ์์ํฌ์ด๋ค. ์ด๋ ๋๋์ ์น ํธ๋ํฝ (I/O๊ฐ ๋ง์ ์น ์๋น์ค ๋ก์ง)์์ MVC์ ๋๋นํ์ฌ ํจ์จ์ ์ด๊ณ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ฉ๋๊ณ ์๋ค. ๋งค๋ฒ WebFlux์ ์ฑ๋ฅ์ด ์ข๋ค๊ณ ๋ ํ ์ ์์!๋๋ณด๊ธฐ๐ ๊ทธ๋ฌ๋ฉด ์ฃผ๋ก ์ด๋์์ ํ์ฉ๋๋...?๋ง์ดํฌ๋ก์๋น์ค์์ ๋ค์ํ ๋์ ์์ฒญ์ ์ํํ๋ gateway server์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ํ ์น์์ผ๋๋์ I/O๋ฅผ ์ฒ๋ฆฌํ๋ ์ค์๊ฐ ์ฑํ
์๋น์ค Spring MVC vs Spring WebFluxSpring ๊ณต์ ํ์ด์ง์ ๋์์๋ ํ๋ฅผ ํตํด ๋์ ์ฐจ์ด์ ์ ์ ์ ์๋ค.WebFlux๋ ๋น๋๊ธฐ/๋
ผ๋ธ๋กํน์ด..