Coding Planet

[Spring] ์ „์ž์ •๋ถ€ํ”„๋ ˆ์ž„์›Œํฌ 4.2 - WebFlux, Nonblocking ๋ณธ๋ฌธ

๐ŸŒฑSPRING

[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๊ฐ€ ๋„์ž…๋˜์—ˆ๋‹ค.

2023 ์ „์ž์ •๋ถ€ ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์‹ ๊ทœ๋ฒ„์ „ ๋ฐœํ‘œํšŒ ์ž๋ฃŒ

 

 

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 : ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์  ์‚ฌ์šฉ ๊ด€์ ์—์„œ ์œ ๋ฆฌํ•œ ๋ชจ๋ธ์ด๋‹ค. 

 

IBM developerWorks์˜ 2:2 ๋งคํŠธ๋ฆญ์Šค

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
Comments