Spring MVC vs WebFlux
๋๊ธฐ, ๋น๋๊ธฐ, ๋ธ๋กํน, ๋
ผ๋ธ๋กํน
๋จผ์ Spring MVC์ WebFlux์ ์ฐจ์ด์ ์ ๋ํด์ ๋ณด๊ธฐ์ ์ ๋๊ธฐ/๋น๋๊ธฐ, ๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ๋ํด์ ์์๋ณด์.
๋๊ธฐ(Synchronous)
ํ์๋ ๋๊ธฐ๋ผ๋ ๋ง์ ์ฒ์๋ดค์ ๋ ๋ฌด์จ ๋ป์ธ์ง ์ดํด์กฐ์ฐจ ๋ชปํ๋ค. ์์งํ ๋ธ๋กํน์ด๋ผ๋ ๋ง์ ๋งํ์๋ค? ๋งํ์๋์ค์ด๋ค? ๋ฑ์ผ๋ก ํด์ํ๊ณ ์กฐ๊ธ ์ดํด๊ฐ ๊ฐ์ง๋ง ๋๊ธฐ๋ผ๋ ๋ง์ ๋ฌด์ธ๊ฐ ๋ช ํํ๊ฒ ์ ๋ฟ์ง ์์๋ค. ๊ทธ๋์ ์ฌ๋ฌ ๊ธ๋ค์ ๋ณด๋ฉด์ ์๋์ ๊ฐ์ ์ ์๋ฅผ ๋ณด๊ณ ๊ฐ๋จํ๊ฒ ์ดํดํ๋ค.
๋๊ธฐ๋ ํจ์๋ฅผ ํธ์ถํ ๊ณณ์์ ์๋ต์ ๋ฐ๋ ๊ฒ
์ด ๋ง์ ํธ์ถ๊ณผ ์๋ต์ด ๋์์ ์ด๋ฃจ์ด ์ง๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ด๋ค. ํธ์ถ๊ณผ ์๋ต์ด ๋์์ ์ด๋ฃจ์ด ์ง๋ค๋ ๊ฒ ์์ฒด๊ฐ ์๊ธด์๊ธฐ์ผ ์ ์์ง๋ง ๊ทธ๋ฅ ํ๋ง๋๋ก ๋น๋๊ธฐ์ ๋น๊ตํ์ ๋ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ์์ ์ ๋ํ ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ด๋ค.
๋น๋๊ธฐ(Asynchronous)
๋น๋๊ธฐ๋ ๋๊ธฐ์ ๋ค๋ฅด๊ฒ ํน์ ํธ์ถ์์ ๊ณผ ์ฒ๋ฆฌ๊ฒฐ๊ณผ์ ๋ํ ์๋ต์์ ์ด ๊ฐ์ง ์๋ค๋ ๊ฒ์ด๋ค. ์๋ฅผ๋ค์ด ํจ์๋ฅผ ํธ์ถํ์ ๋ ๋ฐ๋ก ๋ฐํ๋ฐ๊ณ ์ฒ๋ฆฌ๊ฒฐ๊ณผ์ ๋ํ ๊ฒ์ ์ถํ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ๋ถํน์ ์์ ์ ์ ๋ฌ ๋ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋์ ๋ค์ํ๋ฒ ๋งํ๋ฉด ๋๊ธฐ(Synchronous)์ ์ฐจ์ด์ ์ ๊ฒฐ๊ณผ์ ๋ํ ์์? ์์ ? ์ด๋ผ๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
Blocking
Blocking์ ํจ์๋ฅผ call ํ์ ๋ ์๋ต์ ๋ฐ๊ธฐ ์ํด ๋ฉ์ถฐ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ค.
์๋ฅผ๋ค์ด ์ฐ๋ฆฌ๊ฐ fn hello()๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค๊ณ ๊ฐ์ ํ์ ๋ hello()๋ผ๊ณ ํจ์๋ฅผ ํธ์ถํ๋ฉด ํจ์์ return์ด ์๊ณ ๋์ ํจ์๊ฐ ์ข ๋ฃ๋๊ณ ๋ค์์ค์ i++; ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ด๋ค.
Non-blocking
Non-blocking์ ํจ์๋ฅผ call ํ์ ๋ blocking๊ณผ ๋ค๋ฅด๊ฒ ํจ์์ ๊ฒฐ๊ณผ๊ฐ ์ค๊ธฐ ์ ์ ๋ค์์ค์ ์คํํ๋ ์ํ๋ฅผ ๋งํ๋ค.
์ด๊ฒ ๋ํ ์๋ฅผ๋ค๋ฉด hello()๋ฅผ ํธ์ถํ์ด๋ return์ด ๋๊ธฐ ์ ์ ๋ค์์ค์ i++; ๊ฐ์ ์ฝ๋๊ฐ ์คํ๋ ์ ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ค.
๊ฐ๋จํ๊ฒ๋๋ง ๋๊ธฐ, ๋น๋๊ธฐ, ๋ธ๋กํน, ๋ ผ๋ธ๋กํน์ ๋ํด ์ค๋ช ํ๋๋ฐ ์ฌ์ค ํ์๋ํ ์ ์ผ๋ฉด์ ์ฝ๋๋ ๋ฒจ์์ ์๊ฐํด๋ดค์๋ Synchronous & Blocking ์กฐํฉ ๋ฑ์ด ๊ฐ์ด ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๊ฐ ๋ผ๋ ์๊ฐ์ด ๋ ๋ค.
์ด๋ฐ ๊ฐ๋ ์ ๋ฏธ๋ฆฌ ์ค๋ช ํ ์ด์ ๋ Spring MVC๊ฐ ๋๊ธฐ์ ์ผ๋ก ๋์ํ๊ณ WebFlux๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ์ด ๋์ ๋ํด์ ์์๋ณด์.
Spring MVC
Spring MVC๊ฐ์ ๊ฒฝ์ฐ๋ ์ฐ๋ฆฌ๊ฐ Spring Framework์ Boot๋ฅผ ์ฐ๋ฉด์ ๊ฐ์ฅ ๋ณดํธ์ ์ผ๋ก ์ฐ๋ ๋ฐฉ์์ผ ๊ฒ์ด๋ค. ํ์ ๋ํ ์ด ๋ฐฉ๋ฒ์ ๋ง์ด ์จ์๋ค. Spring MVC์ ๊ฒฝ์ฐ ์ฌ์ฉ์์ ์์ฒญ์ด ๋ค์ด์์ ๋ ๊ทธ ๋๋ง๋ค Thread๋ฅผ ์์ฑํ์ฌ ์ฒ๋ฆฌํ๋ค. ํ์ง๋ง ๋ค์์ ์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์์ ๋ Thread๋ฅผ ๊ณ์ ์์ฑํ๋ค๋ ๊ฒ์ Thread๋ฅผ ์์ฑํ๋ ๋ฑ์ ๋ฆฌ์์ค๊ฐ ๊ต์ฅํ ๋ง์ด ๋ค์ด๊ฐ๋ค. ๊ทธ๋์ Spring MVC์ ๊ฒฝ์ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ฉด์ Thread๋ฅผ ์์ฑํ๋ฉด Pool์ ๋ง๋ค์ด ๋๋๋ค(Thread). ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๊ทธ ์์ฒญ์ Queue์ ์๊ณ ์ด๊ฒ์ Thread Pool์ Thread๋ค์ด ์์ฒญ์ ๊ฐ์ ธ๊ฐ ์ฒ๋ฆฌํ๋ค. ์ด ๋ฐฉ์์ ๋จ์ ์ด ์๋๋ฐ ์์ฒญ๋๊ฒ ๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ์์ฒญ์ ๋ณด๋ผ ๊ฒฝ์ฐ Pool Size๋ฅผ ์ด๊ณผํ์ฌ Queue์ ๊ณ์ ์์ฒญ์ด ์์ด๋ ํ์์ด ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋์ ์์ฒญ์ ๊ณ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ Thread Pool Hell์ด๋ผ๋ ํ์์ด ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ Spring MVC์ ๊ฒฝ์ฐ ๊ฐ๋ฐํ๋ ํด๋น ์์คํ ์ ํธ๋ํฝ์ ์ธก์ ํ์ฌ Pool Size๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค๊ณ ํ ์ ์๊ฒ ๋ค.
WebFlux
Spring WebFlux์ ๊ฒฝ์ฐ์๋ ๊ณ์ ์ด์๊ฐ ๋๊ณ ์๋ Event driven ๋ฐฉ์์ด๊ณ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ด๋ค. WebFlux๋ Node.js์ฒ๋ผ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋์์ ์์ฒญ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ๊ทธ๊ฒ์ ๋ง๋ ํธ๋ค๋ฌ์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ณ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด callback ๋ฉ์๋ ๋ฑ์ ํตํด ์๋ต์ ๋ฐํํ๋ค. ๊ทธ๋์ ์ด ๋ฐฉ์์ ๊ฒฝ์ฐ Spring MVC์ ๋นํด ์ฌ์ฉ์์ ์์ฒญ์ ๋๋์ผ๋ก ๋ฐ์๋ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ฌด์กฐ๊ฑด WebFlux๋ฅผ ์ด๋ค๊ณ ์ข์๊น? ๋ด ์๊ฐ์ ์๋๋ผ๊ณ ๋งํ๊ณ ์ถ๋ค. ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํ์ดํ๋ผ์ธ์ ์์๋ค์ด ๋ชจ๋ ๋ ผ๋ธ๋กํนํ๊ฒ ๋์ํด์ผ๋ง ์๋ฏธ๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ด๋ค ํน์ ํ ๊ตฌ๊ฐ์์ ๋ธ๋กํน์ด ๋ฐ์ํ๋ ๊ตฌ๊ฐ์ด ์๋ค๋ฉด ๊ฑฐ๊ธฐ์๋ถํฐ Thread Pool Hell๊ฐ์ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์งํ๋ฅผ ์ธก์ ํด์ WebFlux๋ก ํจ์จ์ ๋ณผ ์ ์๋ ๊ตฌ๊ฐ์ ๋๋ฌํ์ ๋ ์ ์ฉํ๋ ๊ฒ์ด ๋ง๋ค๊ณ ์๊ฐ์ด ๋ ๋ค.
Boot1์ด Spring MVC๋ก ๊ฐ๋ฐ๋ ๊ฒ์ด๊ณ Boot2๊ฐ WebFlux์ด๋ค. ์ด์ฒ๋ผ ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ์ฐจ์ด๊ฐ ๋๋ ๊ตฌ๊ฐ์ด ์๋ค. ์ด๋ WebFlux๋ฅผ ์ ์ฉํด์ผ ํจ์จ์ ๋ณผ ์ ์์ง ์์๊น ์๊ฐํ๋ค. ๊ทธ๋์ ๋ง์ฝ Spring MVC์์ WebFlux๋ก ์ ํ์ ์๊ฐํ๋ค๋ฉด ์ด๋ฐ ์งํ๋ฅผ ๋ณด๊ณ ์ ํํด์ ํจ์จ์ ๋ณผ ์ ์์ผ๋ฉด ์ ํํ๋ ๊ฒ์ด ๋ง์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
Last updated