๐ Spring WebFlux, Reactive Stream, R2DBC, Mono, Flux ์ ๋ณตํ๊ธฐ

๊ฐ์ #
Non-Blocking ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ api๊ฐ ๋๊ท๋ชจ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ์์ ์ฑ๋ฅ ํฅ์์ ์ํด ๊ฑฐ์ ํ์๋ค ์ถ์ด ์ฌ์ฉ๋๋ ๊ธฐ์ ์ด๋ค. ๊ทธ๋ ๊ธฐ์ ์ค๋ Webflux์ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ, ๋ ผ๋ธ๋ผํน์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
Non-Blocking #
Non-Blocking์ ํ ๋ฒ์ ํ๋์ ์์ ์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ์ ์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋๋ก ํ๋ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ด๋ค.
Non-Blocking ํน์ง
- ์ ์ถ๋ ฅ ์์ ์ด๋ ๊ธด ์์ ์ ์ํํ๋ ๋์ CPU๊ฐ ๋ค๋ฅธ ์์ ์ ํ ๋นํด ์์์ ์ต๋ํ ํ์ฉํ ์ ์๋ค.
- ๋ค์ค ์ค๋ ๋์ ๋ฌ๋ฆฌ ์ค๋ ๋ ๊ฐ์ ์ปจํ ์คํธ ์ค์์นญ์ด ๋ฐ์ํ์ง ์์ CPU ๋ถํ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ ์ ์๋ค.
Spring WebFlux #
Spring WebFlux๋ Spring5์์ ์ถ๊ฐ๋ Reactive-Stack์ ์น ํ๋ ์์ํฌ๋ก, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ๋ฆฌ์กํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ Non-Blocking Reactive-Stream์ ์ง์ํ๋ค.
WebFlux๊ฐ ์๊ธด ์ด์ ๋ก๋
์ ์ ์์ ์ค๋ ๋์ ์ต์ํ์ ํ๋์จ์ด ์์์ผ๋ก ๋์์ฑ์ ํธ๋ค๋งํ๊ธฐ ์ํจ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์ด ์๋ค.
Spirng WebFlux ๋ฑ์ฅ ๋ฐฐ๊ฒฝ #
Spring WebFlux๋ ๊ธฐ์กด ์คํ๋ง MVC์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ์ Reactive Programming์ ์ ์ฉํ ์คํ๋ง ํ๋ ์ ์ํฌ ๋ชจ๋ ์ค ํ๋๋ค.
๊ธฐ์กด ์คํ๋ง MVC๋ ์๋ธ๋ฆฟ ์คํฉ์์ ์ง์ํ๋ Thread-Per-Request ๋ชจ๋ธ๋ก ๋์ํ๋ค. ์ด๋ ์์ฒญ ํ๋๋น ํ๋์ ์ค๋ ๋๊ฐ ํ ๋น๋๋ ๋ฐฉ์์ผ๋ก, ํ๋์ ์์ฒญ ์ฒ๋ฆฌ์ ๋ธ๋กํน์ด ๋ฐ์ํ๋ฉด ํด๋น ์์ฒญ์ ํ ๋น๋ ์ค๋ ๋๋ ๊ณ์ ๋ธ๋กํน ์ํ๋ก ๋จ์์๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ธ๋กํน I/O๋ CPU ์์์ ๋ญ๋นํ๋ ์์ธ ์ค ํ๋๋ค. ๋ํ, ๋ง์ ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ๋ง์ ์์ ์ค๋ ๋๊ฐ ํ์ํ๋ฏ๋ก ์๋ฒ์์ ์ค๋ ๋ ๊ฐ์๋ฅผ ๋ฏธ๋ฆฌ ๊ณ ์ ํด์ผ ํ๋ฉฐ, ์ด๋ ์ค๋ ๋ ์ปจํ ์คํธ ์ค์์นญ์ ๋ฐ๋ฅธ ๋ถํ ์ฆ๊ฐ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค.
์ดํด ๋นํด Reactive Programming Model์ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ Non-Blocking I/O๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์ค๋ ๋๋ฅผ ๋ธ๋กํนํ์ง ์๊ณ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ธ๋กํน I/O ๋๊ธฐ ์๊ฐ ๋์์๋ ๋ค๋ฅธ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ํ์ ๋ ๋ฆฌ์์ค๋ก๋ ๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค..
์ฆ Spring WebFlux๋ ์ด๋ฌํ Reactive Programming Model์ ์ง์ํ๊ณ ๋์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ค.
๋น๋๊ธฐ ๋ ผ๋ธ๋กํน ํ๊ฒฝ์ ์๋ฒ๋ก Netty๊ฐ ๋ถ์ํ๊ณ ์์์ผ๋ฉฐ ์ด Netty์์ ์ฐ๋์ ์ํด Spring์ ์๋ก์ด API๊ฐ ํ์ํ๋ค.
์คํ๋ง ์นํ๋ญ์ค๋ ์๋์ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉํ๊ธฐ๋ฅผ ์ถ์ฒ๋๋ค.
- ๋น๋๊ธฐ, non-blocking reactive ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ
- ํจ์จ์ ์ผ๋ก ๋์ํ๋ ๊ณ ์ฑ๋ฅ ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ฌ์ฉ
- ์๋น์ค๊ฐ ํธ์ถ์ด ๋ง์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ์ ํฉ
Spring WebFlux :
-> many request : 1 thread, async + Non-Blocking
Spring MVC : 1 request :
-> 1 thread, sync + Blocking
Reactive Stream #
Reactive Stream์ ๋น๋๊ธฐ์ , Non-Blocking, backpressure ๊ธฐ๋ฐ์ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ์ค ์คํ์ด๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํ ๋, ๋ค๋ฅธ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋๊ธฐ ์๊ฐ์ด ์์ด์ง๊ณ , ์์ ์ด ์ฒ๋ฆฌ๋๋ฉด ์ฆ์ ๋ค์ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ด ๋ ํจ์จ์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ํ์ฉํ ์ ์๋ค.
Reactive Stream์ Publisher-Subscriber ํจํด์ ์ฌ์ฉํด, Publisher๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ Subscriber๋ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ด ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ์ ์๊ณผ ์๋๊ฐ Subscriber๊ฐ ์ฒ๋ฆฌํ๋ ๋ฅ๋ ฅ์ ์ด๊ณผํ ์ ์๋ ๊ฒฝ์ฐ, backpressure๋ฅผ ํตํด Publisher๊ฐ ๋ฐ์ดํฐ ์์ฐ์ ์ ํํ์ฌ Subscriber๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์๋์ ๋ง์ถฐ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ค.
R2DBC #
R2DBC (Reactive Relational Deatabase Connectivity)๋ ์ ์ ์์ ์ค๋ ๋๋ก ๋์์ฑ์ ์ฒ๋ฆฌํ๊ณ ๋ ์ ์ ํ๋์จ์ด ๋ฆฌ์์ค๋ก ํ์ฅํ ์ ์๋ Non-Blocking ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ด๋ค.
๊ถํฉ์ผ๋ก๋
- spirng mvc : jpa
- spring webflux: r2dbc
์ด๋ ๊ฒ ๋ณผ ์ ์๋ค.
Reactive Model์ด๊ธฐ ๋๋ฌธ์ findAll()๊ณผ ๊ฐ์ ์ฐ์ฐ์ ํ์๋ List
Mono & Flux #
Spring Webflux์์ ์ฌ์ฉํ๋ reactive library๋ Reactor์ด๊ณ Reactor๊ฐ Reactive Streams์ ๊ตฌํ์ฒด๋ค. ๊ทธ๋์ Webflux ๋ฌธ์์ Reactive Streams๊ฐ ์ธ๊ธ๋๋ ๊ฒ์ด๊ณ ๊ทธ๊ฒ๊ณผ ๊ฐ์ด Reactor๊ฐ ๋์จ๋ค.
์ฃผ์ ๊ฐ์ฒด์ธ Mono / Flux๋ ๊ฒฐ๊ตญ ์น ํ๋ญ์ค์ ๋์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋๋ฐ ๊ผญ ์๊ณ ๋์ด๊ฐ์ผํ๋ค.
- Mono : 0 ~ 1๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ
- Flux : 0 ~ N๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ
Mono์ Flux๋ Reactive Streams์ Publisher ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด์ด๋ค.
Mono #

Flux #

๋ง๋ฌด๋ฆฌ ์ด์ด #
์ด๋ ๊ฒ WebFlux์ ๋ํด์, ๊ด๋ จ ์ฉ์ด์ ๋ํด์ ๊ณต๋ถ๋ฅผ ํด๋ณด์๋ค ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์งํฅํ๊ธฐ ์ํ ๋์ ๊ณต๋ถ๋ ๋์์์ด..!