์ ์ด์ ์ผ?
๋ํ๋ฏผ๊ตญ์ด๋ผ๋ ํ๊ฒฝ์์ Java์ Spring์ ๊ต์ฅํ ๋ง๊ฐํ ์์ฅ ์ ์ ์จ์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค. ์ฌ์ค์ ๋๋ถ๋ถ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๊ตฌ์ธ๋ Spring์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๊ณ ์์ ๋งํผ, ์ทจ์ ์ ์ค๋นํ๋ ์ ์ฅ์์ Spring์ ๋ฅ์ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ ์ญ๋์ ๊ฐ๊น์ด ๋ฌด์ธ๊ฐ๊ฐ ๋์ด๊ฐ๊ณ ์๋ค.
๋๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ฅผ ์ง๋งํ๊ณ ์๋ค ๋ณด๋, ์ด๋ฌํ ์ํ๊ณ์ ๊ตญ๋ด ํ๊ฒฝ์ ๋ํด ์ตํ ๋ค์ด ์๊ณ ์์๋ค. ๊ทธ๋ผ์๋ ์ง๊ธ์ ์์์ผ Spring์ ๊ณต๋ถํ๊ธฐ ์์ํ ๊ฒ์ ์ฌ์ค Java๋ฅผ ๋ฉ๋ฆฌ ํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ๊ทธ ์ด์ ๊ฐ ์ฐธ ๊ฐ์๋กญ๋ค.
๋๋ 2017๋ ์ ๋ํ์ ์ ํํด์ C ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๋ฉฐ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ฌธํ๊ณ , 2018๋ ์ ํ๊ต์์ ์ฒ์์ผ๋ก Java๋ฅผ ๋ฐฐ์ ๋ค. ๊ทธ ๋น์์๋ ์๊ณ ์๋ ์ธ์ด๊ฐ C ๋ฐ์ ์์์ผ๋ Java๋ ๋๋ฌด ๋ฉ์ง ์ธ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ ์ง๋ง 2019๋ ์ด ๋์ด Python๊ณผ Javascript๋ฅผ ์๊ฒ ๋๋ฉด์ ์ฌ๋ฌ๋ชจ๋ก ์๊ฐ์ด ๋ณต์กํด์ก๋ค. ๊ทธ ๋ ๋ฌธ๋ ํ๊ฒ ๋ ์๊ฐ์ โ์โฆ ๋ญ๊น ์ด ์ธ์ด, C++๋ณด๋ค๋ ๋๋ฆฌ๋ฉด์ Python์ด๋ Javascript์ ๋นํด์๋ ์ฝ๋๊ฐ ๋ชป์๊ธดโฆ ๋ญ๊ฐ ๋ฉ์ง์ง ์์๊ฑธ?โ ์ด์๋ค. ๋ ๋ฒ์งธ๋ก ๋ฐฐ์ด ์ธ์ด์ด๋ค ๋ณด๋ ๊ณ ๋ฆฌํ๋ถํ๋ค๊ณ ๋ ์๊ฐํ๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฐ ๋ง๋ ์๋๋ ์ด์ ๋ก ๊ทธ๋ฅ Java ์ชฝ์ผ๋ก๋ ์ ๋ ๋๊ธธ์ ์ฃผ์ง ์์๋ค.
์ง๊ธ ์์ ์๊ฐํด๋ณด๋ฉด ๊ฐ๋ ฅํ GC์ OOP ํจ๋ฌ๋ค์, ๊ทธ๋ฆฌ๊ณ ์ ๊ตฌํ ์ญ์ฌ์ ์ ํต์ ๊ฐ์ง๊ณ ์์ฑ๋ ๋ง์น ์ ๋ก ๋ฐ์ง์๋ฉด ๋ก์ ์ด๋ฃจํธ 32๋ ์ฐ๊ณผ ๊ฐ์ ๊ฑฐ๋ํ ํ๋ ์์ํฌ์ธ Spring์ ๊ฐ์ง๊ณ ์๋ ๊ต์ฅํ ๋๋จํ ์ธ์ด๋ฅผ ๊ทธ๋ฅ ๊ธธ๋ฐ๋ฅ์ ๊ตด๋ฌ๋ค๋๋ ๋๋งน์ด ์ ๋๋ก ์ทจ๊ธํ ๊ฒ์ด์ง๋ง, ๊ทธ ๋ ๊ทธ๋ฐ ์ฌ์ค์ ์๊ธฐ์ ๋๋ฌด๋๋ ๋ด ์๊ฒฌ์ด ์์๋ค. (์ง๊ธ์ด๋ผ๊ณ ๊น์ ๊ฒ ๊ฐ์ง๋ ์์ง๋ง)
Java๋ฅผ ๋ฉ๋ฆฌ ํ๋ค ๋ณด๋, Spring์ ๊ณต๋ถํ๋ค๋ ๊ฒ์ ๋ง๋ ์๋๋ ์ผ์ด์๋ค. ๊ทธ๋์ ์ง๊ธ๊ป ํญ์ Spring์ ๊ณต๋ถํ๋ ๊ฒ์ ๊ตฐ๋๋ฅผ ์ ์ญํ๊ณ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ทจ์ ์ ์ค๋นํ๋ ์น๊ตฌ๋ค์๊ฒ ์ถ์ฒํ ์ง์ธ์ , ์ค์ค๋ก ๊ณต๋ถํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ์ง ์์๋ค.
์ด์ ์์๋ ์?
๊ทธ ์ดํ๋ก ์๋ฒ๋ฅผ ์์ฑํด์ผ ํ ์ผ์ด ์๊ธธ ๋๋ง๋ค ๋๋ถ๋ถ node.js ๋ฅผ ํตํด์ ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ค. Javascript์ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ๋ ๋ง์์ ๋ค์๊ณ , ์กฐ๊ธ ๋ค๋ฅธ ์ด์ผ๊ธฐ์ด๊ธด ํ์ง๋ง ์ ํ์ ์ฒ ํ์ฒ๋ผ, โ๊ทธ๋ฅ ๋จโ ์ด๋ผ๋ ๋๋์ ๋ฐ๋ ๊ฒ๋ ๋๋ฌด ์ข์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ์ถ๋ก ์ ์์ด์ ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๋ถ๋ถ์ Typescript๋ผ๋ ๋ฉ์ง Superset์ ํตํด์ ํด๊ฒฐํ ์ ์์ผ๋ ์ฌ์ค์ ์ด๊ฑธ๋ก ๋ค ํด๋จน์ ์ ์๊ฒ ๋ค๋ผ๋ ์๊ฐ๊น์ง ๊ฐ์ง๊ณ ์์๋ค. (์ฌ์ค ๋ค ํด๋จน์ ์ ์๊ฒ ๋ค๋ ์ด ์๊ฐ์ ์ง๊ธ๊น์ง๋ ์ ํจํ๋ค.)
๊ทธ๋ ์ง๋ง ํญ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ๋ฐ๋ผ์ ์์ฑํ๊ณ ํ๋ก์ ํธ์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ํ๋ ๋ฑ์ ์์ ์ ํ ๋๋ง๋ค ๋ญ๊ฐ ๋ง์ ํ์ผ ์ด ๋ถํธํ๋ค.
โ์ด๊ฒ ์ง์ง ์ ์ผ ๋์ ํจํด์ผ๊น?โ
โ์ด ํจํด์ ๋ด๊ฐ ์ ๋๋ก ์ง์ผ๊ฐ๋ฉด์ ์์ฑํ๊ณ ์์๊น?โ
์ด์งธ์ ์งธ ์๋ฌ๊ฐ ํฐ์ง๋ฉด ๋์ฐ๊ณ ๊ธฐ์ฐ๊ณ ๋ฎ์ด๊ฐ๋ฉฐ ๊ธฐ๋ฅ์ ๊ตฌํํ ์๋ ์์์ง๋ง ๋ด๊ฐ ์ฌ๋ฐ๋ฅธ ํจํด์ ์ฌ์ฉํ๊ณ ์๋จ ์๊ฐ๊ณผ, ์ด ์ฌ์ฉํ๋ ํจํด์ ๊ท์น์ ์ถฉ์คํ ๋ฐ๋ฅด๊ณ ์๋ค๋ ์๊ฐ์ด ๋ค์ง ์์๋ค. ๊ทธ๋ฆฌ๊ณ 2020๋ ์ด ๋์ด, ํ ๋ฉ์ง node.js ํ๋ ์์ํฌ๋ฅผ ๋ง๋๊ณ ๊ทธ ํด๋ต์ ์ฐพ์ ๊ฒ๋ง ๊ฐ์๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก NestJS ์๋ค. Module, Controller, Service๋ก ๋ ์ด์ด๋ฅผ ๋๋์ด์ ๊ทธ ๊ตฌ์กฐ์ ๋ง์ถ์ด์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ ๊ณผ, ์ ์ ์ ์์ Decorator Function์ ์ฌ์ฉํ์ ๋ ์ป์ ์ ์๋ ์ฝ๋์ ๊ฐ๋ ์ฑ ๋ฑ ์ ๋ง ๋ง์์ ๋๋ ์ ์ด ๋ง์๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๋ค ์ปค๋ฎค๋ํฐ(์ ํํ ์ด๋์๋์ง ๊ธฐ์ต์ด ์ ๋์ง ์๋๋ค.)์์ โ์์งํ Nest ํ ๋ฐ์ Spring ํ๊ณ ๋ง์ง ในใ ใ ใ โ ๋ผ๋ ๋ง์ ํ๋ ๊ฒ์ ๋ดค๊ณ , Spring์ ๊ธฐ๋ณธ ์ปจ์ ์ ์ฐพ์๋ณด๊ณ ๋์ IoC์ DI ๋ฑ์ด Nest์ ๊ต์ฅํ ์ ์ฌํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์ ๋ง์ Opnionated Framework (๋๋์ ๋ฒ์ญํด๋ณด์๋ฉด, ์์ ๊ด๋ฆฌํ ํ๋ ์์ํฌ ์ ๋)๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๋ฉด ์ ๊ตณ์ด node.js๋ฅผ ์ฌ์ฉํ๋๋ผ๊ณ ๋น๊ผฌ๋ ์ด์กฐ์๋ค.
์ ๋ณด๋ฅผ ์กฐ๊ธ ๋ ์ฐพ์๋ณธ ํ ๋๋ Opinionated Framework๋ค์ ๊ตฌ์กฐ์ ํน์ง๊ณผ ์ฅ๋จ์ ์ ์ ํํ ์ดํดํ๊ณ ์์ด์ผ๋ง node.js์ Express๋ Python์ Flask, Go์ echo ๊ฐ์ Micro Framework๋ฅผ ์ฌ์ฉํ ๋์๋ ๊ตฌ์กฐ์ ์ผ๋ก ๋ ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์กฐ ๋ง์ง์ธ Spring์ ๊ณต๋ถํด์ผ๊ฒ ๋ค๊ณ ๋ง์ ๋จน์๋๋ฐ, Spring์ ์๋ ๊ฐ๋ฐ๋์ง ์ค๋๋์๊ณ , ์ฐ๋ฆฌ๋๋ผ์์ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ์ ์ด๊ณ ๊ตฌ์ฒด์ ์ธ ์๋ฆฌ๊น์ง ์ฌ๋ฌ๊ฐ์ง ์์ ์ด๋ ๊ฐ์๋ค์ ํตํด์ ๋ฐฐ์ธ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ ๋ค๋ฆ๊ฒ๋๋ง ๋๋ Spring์ ๊ณต๋ถํ๊ฒ ๋์๋ค. ์ฌ์ค ์ด๋ฐ ์ ์ด์ธ์๋ ํ์ฌ node.js๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์ ์ ์ฅ์์ Spring์ ํ๋ฒ์ฏค ๊ณต๋ถํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ์ด์ , ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ๋๋ก Spring์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค์ด node.js์ ๋ํด์ ํ๋ฒ์ฏค ๊ณต๋ถํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ์ด์ ๊ฐ ๋ ์๊ธด ํ๋ฐ ๊ทธ๊ฒ๋ค์ ์ฃผ ๊ณจ์๊ฐ ์๋๊ณ ์ค์ค๋ก๋ ์ ๋๋ก ์ ๋ฆฌํ์ง ๋ชปํ์ผ๋ ์ด๋ฒ์ ๋์ด๊ฐ๋๋ก ํ๊ณ , ๋ค์์ ๊ธ๋ก ํ์ด๋ณด๋ ๊ธฐํ๋ฅผ ๊ฐ์ง๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
์ด์จ๊ฑฐ๋ ์ ์จ๊ฑฐ๋
์์ผ๋ก 8์ฃผ ๋์์ Spring Boot ์คํฐ๋๋ฅผ ํ๋ ๊พธ๋ฆฌ๊ฒ ๋์ด, ์คํฐ๋์๋ถ๋ค๊ณผ ํจ๊ป Spring์ ๋ํด์ ๊ณต๋ถํ ๊ฒ ๊ฐ๋ค. ๋ค์ํ ์๊ฐ์ ๊ฐ์ง ์ ์๋ ๊ธฐํ๊ฐ ๋ ๊ฒ ๊ฐ์ ์ฌ๋ฌ๋ชจ๋ก ๊ธฐ๋๊ฐ ๋๋ค.
๋.