Coding Planet
[Spring] ์ ์์ ๋ถํ๋ ์์ํฌ 4.2 - WebFlux, Nonblocking ๋ณธ๋ฌธ
[Spring] ์ ์์ ๋ถํ๋ ์์ํฌ 4.2 - WebFlux, Nonblocking
jhj.sharon 2024. 5. 7. 10:56
์ผ๋ง์ ์ ์์ ๋ถํ๋ ์์ํฌ๋ฅผ ์ฃผ๊ดํ๊ณ ๊ด๋ฆฌํ๋ NIA์์ ์ ๊ท๋ฒ์ 4.2์ ์ฐ์ ํ์ฉ์ฌ๋ก์ ๋ํด Zoom์ผ๋ก ์ธ๋ฏธ๋๋ฅผ ์งํํ๋ค. ์ด๋ณด ๊ฐ๋ฐ์๋ก์ ์ดํดํ์ง ๋ชปํ๋ ๋ถ๋ถ์ด ์๋นํ์ง๋ง ํ์ฌ ์งํ์ค์ธ ์ฐ๋ฆฌ ํ๋ก์ ํธ์์ ๊ณ ๋ฏผํ๋ ์ฌํญ๊ณผ ๋ง๋ฟ์ ์๋ ์ฃผ์ ๊ฐ ์์ด์ ์ ๋ฆฌํ๋ค.
1. WebFlux
Spring Framework 5์์ ์๋กญ๊ณ ์๊ฐ๋ ๋ชจ๋์ด๋ค. ๋น๋๊ธฐ์ ์ด๊ณ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ์ ์๊ฒ ํด์ค๋ค. ์ ํต์ ์ธ ์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ์คํ๋ง MVC์ ๋ฌ๋ฆฌ, WebFlux๋ Reactive Streams API๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ์ฒ๋ฆฌ ์ ๋ฐ์ํ ์ ์๋ I/O ์์
์์ ์๋ฒ์ ์์ ํ์ฉ๋๋ฅผ ์ต๋ํํ๋ค.
๊ฐ๋จํ ๋งํด, WebFlux๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ด์, ํจ์จ์ ์ผ๋ก ์๋ฒ ์์์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ณ ์ฑ๋ฅ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ๋ ์ ๋ฆฌํ๋ค. WebFlux๋ ์คํ๋ง 5.0 ์ด์์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ๋ก๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌํํ ์ ์๋ ๊ฒ์ด ํน์ง์ด๋ค.
์๋ Spring Framkework์์๋ Servlet API์ Servlet ์ปจํ ์ด๋๋ง ์์๋๋ฐ WebFlux๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
Spring MVC๋ Java EE์ Servlet Spect์ ๊ธฐ๋ฐํ์ฌ ๋ง๋ค์ด์ก๊ณ ๋ณธ์ง์ ์ผ๋ก Blocking + ๋๊ธฐ๋ฐฉ์์ด๋ค. ์ด๋ฅผ ๊ทน๋ณตํ์ฌ Reactive Programming์ ์ํด WebFlus๊ฐ ๋์ ๋์๋ค.
2. Reactive Programing
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ(Reactive Programming)์ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๋ณํ ์ ํ์ ์ค์ ์ ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด๋ค. ์ด ๋ฐฉ์์ ๋ฐ์ดํฐ ์คํธ๋ฆผ๊ณผ ๊ทธ ๋ฐ์ดํฐ์ ๋ณํ์ ๋ฐ๋ฅธ ๋ฐ์์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์ด ์๋ค. ์ฃผ๋ก ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ๋ฉฐ, ๋ฐ์ดํฐ ์คํธ๋ฆผ๊ณผ ๋ฐ์ํ ์ ์๋ ์ด๋ฒคํธ๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ "๋ฐ์ํ๋ผ(React)"์ด๋ค. ์ฆ, ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด, ์ด์ ์๋์ผ๋ก ๋ฐ์ํ์ฌ ํ์ํ ์ฐ์ฐ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ์ด๋ฐ ํน์ฑ ๋๋ถ์, ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฅ์ฑ์ด ๋๊ณ , ๋ณต์กํ ๋น๋๊ธฐ์ ์ธ ํ๊ฒฝ์์๋ ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋ค.
Reactive Programing์ ์ํด ํ์ํ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ, ๋ ผ๋ธ๋กํน ํ๋ก๊ทธ๋๋ฐ์ ์ํด WebFlux๊ฐ ๋์ ๋ ๊ฒ์ด๋ค.
3. Non-Blocking
Non-Blocking (๋ ผ๋ธ๋กํน) ์ด๋ ํ๋ก๊ทธ๋๋ฐ์์ ํ ์์ ์ด ๋ค๋ฅธ ์์ ์ ๋ง์ง ์๊ณ ๋์์ ์ํ๋ ์ ์๋๋ก ํ๋ ๋ฐฉ์์ ๋งํ๋ค. ์ฆ, ์ด๋ค ์์ ์ด ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์คํ์ ์ฐจ๋จํ์ง ์๊ณ , ์์์ ๊ธฐ๋ค๋ฆด ๋๋ ๊ณ์ํด์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ ๊ฒ์ด๋ค.
๋น๋๊ธฐ (Asynchronous) ๋ ์์ ์ ์คํ์ด ์์๋ ํ ๊ทธ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ ๋ฐฉ์์ ์๋ฏธํ๋ค. ์ดํ ํด๋น ์์ ์ด ์๋ฃ๋๋ฉด, ์ฝ๋ฐฑ ํจ์๋ ์ด๋ฒคํธ, ํ๋ก๋ฏธ์ค ๋ฑ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋น๋๊ธฐ ๋ฐฉ์์ ํนํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ๋ธ๋ก๋์ง ์๊ณ ๋ฐ์์ฑ์ ์ ์งํด์ผ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ํ๋ค.
์ด๋ก ์ ์ผ๋ก ์ด๋ฌํ๋ฐ, ๋
ผ๋ธ๋กํน๊ณผ ๋น๋๊ธฐ์ ์ฐจ์ด๊ฐ ์ดํด๊ฐ ๋์ง ์์๋ค. ๊ณต๋ถํ๋ฉด์ ์๋ ๋ธ๋ก๊ทธ๋ค์ ๋์์ ๋ฐ์๋ค.
- Blocking/Non-Blocking : ํธ์ถ๋๋ ํจ์๊ฐ ๋ฐ๋ก ๋ฆฌํด์ ํ๋๋ ๋ง๋๋๊ฐ ๊ด์ฌ์ฌ๋ค. ์ฌ๊ธฐ์ ์ ์ด๊ถ์ด ํต์ฌ์ธ๋ฐ ํธ์ถ๋ ํจ์๊ฐ ์์ ์ ์๋ฃ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ฐ๋ก ์ ์ด๊ถ์ ๋ค์ ๋๊ฒจ์ค๋ค๋ฉด NonBlocking์ด๋ค. ๋ง์ฝ ํธ์ถ๋ ํจ์๊ฐ ์์ ์ ์์ ์ ๋๋ผ๋๊น์ง ์ ์ด๊ถ์ ๋๋ ค์ฃผ์ง ์๊ณ ํธ์ถํ ํจ์๊ฐ ๋๊ธฐํ๋๋ก ํ๋ค๋ฉด Blocking์ด๋ค.
- Synchronous/Asynchronous : ํธ์ถ ๋๋ ํจ์์ ์์ ์๋ฃ ์ฌ๋ถ๋ฅผ ๋๊ฐ ์ ๊ฒฝ์ฐ๋๋๊ฐ ๊ด์ฌ์ฌ๋ค. ํธ์ถ๋๋ ํจ์์๊ฒ callback์ ์ ๋ฌํ๊ณ ํธ์ถ๋๋ ํจ์๊ฐ ์์์ ์์ ํ๊ณ ์์ ์ด ์๋ฃ๋๋ฉด callbackํจ์๊ฐ ์คํ๋์ด ํธ์ถํ๋ ํจ์๊ฐ ์์ ์๋ฃ์ฌ๋ถ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์ผ๋ฉด Asynchronous์ด๋ค.
์ฌ๊ธฐ์ ๊ทธ๋ ๋ค๋ฉด Blocking-Async๋ ์์ถฉ๋๋ ๊ฐ๋ ์ธ๋ฐ ์ด๊ฒ ์ ํ์ํ๋ ์ถ์๋ฐ ๊ฐ๋ ์ ๋ถ๋ฅ๋ง ํด๋๊ณ ์ค์ ๋ก๋ ์ฐ์ง ์๋๋ค๊ณ ํ๋ค. ๋ค๋ง ์๋ํ์ง๋ ์์์ง๋ง Blocking-Async๊ฐ ๋ฐ์ํ๊ธฐ๋ ํ๋๋ฐ ๊ทธ ์๊ฐ Node.js์ MySQL ์กฐํฉ์ด๋ผ๊ณ ํ๋ค. (์ฌ๊ธฐ์๋ ์์ธํ ๋ค๋ฃจ์ง ์๊ฒ ๋ค.)
- NonBlocking-Sync : ์์ ๊ด์ฌ์ฌ๋ก ์ ๋ฆฌํ๋ฉด ํธ์ถ๋ ํจ์๋ ์ ์ด๊ถ์ ๋ฐ๋ก ๋ฆฌํดํ๊ณ (Nonblocking), ํธ์ถํ ํจ์๋ ์๋ฃ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค(Sync). Nonblocking์ ์ํด ๋ฐ๋ก ์๋ตํ๊ธฐ ๋๋ฌธ์ ํธ์ถํ๋ ํจ์๊ฐ ํธ์ถ๋๋ ํจ์์ชฝ์ ๊ณ์ ์์ ์๋ ค ์ฌ๋ถ๋ฅผ ๋ฌธ์ํ๋ ํ์์ด๋ค.
- NonBlocking-Async : ์ฑ๋ฅ๊ณผ ํจ์จ์ ์ฌ์ฉ ๊ด์ ์์ ์ ๋ฆฌํ ๋ชจ๋ธ์ด๋ค.
'๐ฑSPRING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Security] ๋ณด์๊ตฌ์ฑ ์ค์ ํ๊ธฐ - context-security.xml(์ ์์ ๋ถ ๋ชจ๋ ํฌํจ) (1) | 2024.02.14 |
---|---|
@RequestBody ์ด๋ ธํ ์ด์ ์ค๋ช ๋ฐ ์์ (1) | 2024.01.03 |
@Controller์ @RestController์ ์ฐจ์ด๋? (1) | 2024.01.02 |
[MyBatis] test์ ์ซ์, ๋ฌธ์์ด ๋น๊ต (ํฐ ๋ฐ์ดํ, ์์ ๋ฐ์ดํ ๊ตฌ๋ถ ๊ผญ!!!!!) (1) | 2023.11.14 |
PRG(Post/Redirect/Get) ํจํด๊ณผ ์์ (0) | 2023.11.08 |