[BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ
Project Git Hub
๐ ๋ชฉ์ฐจ
โ [BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ
โ [BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ : DB ์ฐ๊ฒฐ
โ [BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ : DB ์ฐ๊ฒฐ(Sequelize)
๐ ๋ถ๋ก
โ [Node.js] Node.js ๊ธฐ์ด
โ [JavaScript] ๊ธฐ๋ณธ ๋ฌธ๋ฒ
โ [Web] URL์ ์ดํด
โ [Spring] Spring์ด๋?
๐ค ๋ด๊ฐ ๋ง๋ Error
โ [Node.js][Error] Cannot find module '.dotenv'
๐ Node.js ์์ํ๊ธฐ
๐ฝ ๊ฐ์
์ฃผ๋ํ๋์ SE(Server Engineer) ๊ทผ๋ฌด๋ฅผ ํ๋ค๊ฐ ๊ฐ๋ฐ์๋ก์จ ๋๋ค๋ฅธ ์ธ์์ ์์ํ๊ณ ์ถ๋ค๋ ๊ฟ์ ๊ฐ์ง๊ณ , JAVA์ง์์ `Spring Boot`๋ฅผ ๊ณต๋ถํ๊ณ ์๋ ๊ฒ์ด์์.
์ด๋๋ ๋ฉ์ง Start Up ๋ํ๋๊ป์ ์ ๊ฐ ์ ๋ฆฌํ ๊ธ์ ๋ณด๊ณ , ์ ๋ฌด ๊ด๋ จํด์ ์ด์ผ๊ธฐ๋ฅผ ๋๋๊ณ ์ถ๋ค๊ณ ํ์ ์ ์ด์ผ๊ธฐ๋ฅผ ๋๋ ๊ฒ์ด์์. ์๊ณ ๋ณด๋ ๊ทธ ํ์ฌ๋ `Node.js`๋ฅผ ์ด์ฉํ Server๋ฅผ ๊ตฌ์ถํ๊ณ ์๋ ํ์ฌ๋๋ผ๊ตฌ์.
๋ง์ ํ์ฌ๋ค์ด ์ ์ `Node.js`๋ฅผ ์ฑํํ๊ณ ์๋ ์ ๊ณผ ๋๋ถ์ด ๋ค๋ฅธ ๋ช๋ช ๊ธฐ์ ์ ์์๋์ ๋ถ๋ค๋ ์ฐ๋ฝ์ ์ฃผ์๊ณ ๋ ์์ง๋ง, ์๋ก ์กฐ๊ฑด์ด ๋ง๋ค๋ฉด ์ ์ฌ๋ฅผ ํ๊ณ ์ถ์๋ฐ, `Node.js`๋ฅผ ์์ ๋ชจ๋ฅด๋ฉด ์๋ ๊ฒ ๊ฐ์ ์ด๋์ ๋ ์ดํดํ ์ ์๋ ์์ค๊น์ง๋ ์ต๋ํ ๋์ด์ฌ๋ ค๋ณด์๋ผ๋ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ Coding์ ํด๋ณด๊ณ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์๋ ๊ฒ์ด์์.
`Node.js`๋ฅผ ๊ณต๋ถํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์๋ฅผ ์ฐพ์๋ดค์ง๋ง, ์ฃผ๋ํ๋์ `Sping` ํ๊ฒฝ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ `Node.js`๋ก ๋ฐ๊ฟ๋ณด๋ ๊ฒ์ ํด๋ณด๊ณ ์ถ์๋ฐ, ejs ๋ฑ RESTFul ๋ฐฉ์์ JSON Data ํต์ ์ด ์๋ html ๋ค๋ ๋ค์ด๊ฐ๋ ๋ฑ์ ๊ฐ์๋ค๋ง ์๋ ๊ฒ์ ๋ณธ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ์ด์ฌํ ๊ตฌ๊ธ๋ง์ ํ๊ณ ์ฃผ๋ํ๋์ด ์ํ๋ ๋ด์ฉ๋๋ก ๊ณต๋ถ๋ฅผ ํด๋ณด๋ฉด์ ๋ด์ฉ์ ์ ๋ฆฌ ํด ๋ณผ๊ฒ์ด์์.
๐ฆ Spring VS Node.js
์์ํ๊ธฐ ์ ์จ ์ฃผ๋ํ๋์ด ์ฌ๋ํ๋ `Spring`๊ณผ `Node.js`๋ฅผ ํ๋ฒ ๋น๊ตํด ๋ณธ ๊ฒ์ด์์.
์์ ํ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด `Node.js`๋ `Runtime` ํ๊ฒฝ์ด๊ณ , `Spring`์ `Framework`์ธ ๊ฒ์ด์์. ๋ฐ๋ผ์ `Runtime` ํ๊ฒฝ๊ณผ `Framwork`๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด ์ด๋ถ์ฑ์ค์ผ ์ ์์ผ๋, ๋ ๊ฐ์ง์ ๊ธฐ์ ์ด ์๋ค๋ ์ ์์ ๋น๊ตํด ๋ณด๋ ๊ฒ์ด์์. ๋ํ, ์ด ๋๊ฐ์ง๊ฐ ์ธ๊ธ๋๋ ์ด์ ๋ `Node.js` ๋ฑ์ฅ์ผ๋ก `JavaScript`๋ก Application ๊ฐ๋ฐ์ด ์ฉ์ดํด์ก๊ณ , `Spring`์ ๋ฑ์ฅ์ผ๋ก JAVA์ Application ๊ฐ๋ฐ์ด ์ฉ์ดํด์ก๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๐ฆ Express.js
JAVA์์ Web Application์ ๋ง๋ค๊ธฐ ์ํด `Spring`์ ์ด์ฉํ๋ฏ `Node.js`์์๋ `Express.js`๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด์์. ์ด ์ธ์๋ ์ฌ๋ฌ `Framework`๊ฐ ์์ง๋ง, `Express.js`๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ Web Framework์ด๊ธฐ ๋๋ฌธ์ ์ ํํ ๊ฒ์ด์์. `Express.js`๋ `Spring`๊ณผ ๋น๊ตํ์ ๋, ํจ์ฌ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํ๊ณ , ์ค์ Server Code๋ฅผ ๊ตฌํํ ์ ์๋ ์ฅ์ ์ด ์๋ค๊ณ ํด์.
ํ์ ์์๋ ๋ง์ด ์ ์ฉ๋๋ `ํ์ ์คํฌ๋ฆฝํธ`์ ํจ๊ป ์ด์ฉํ๋ฉด ๋ณดํต `Nest.js`๋ผ๋ `Framework`๋ฅผ ์ด์ฉํ๋ค๊ณ ํฉ๋๋ค.
์ฐธ๊ณ ๋ก `Node.js`๋ `NoSQL`๊ณผ ๊ถํฉ์ด ์ ๋ง์ `MongoDB`๋ฅผ ๋ง์ด ์ด์ฉํ๋๋ฐ, ์ฃผ๋ํ๋์ RDBMS์ธ `MySQL`์ ์ด์ฉํด ๋ณผ ๊ฒ์ด์์.
`Express.js`๋ ๋ฐ๋ก ๋์์ธ ํจํด์ ์ ํ์ง ์๊ณ ์๋๋ฐ, `์ฝ๋ ๊ฐ๋ ์ฑ`๊ณผ `์ ์ง๋ณด์ ์ฑ` ๋ฑ์ ์ํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ `route`, ๊ฐ Route์ ์ ๋ ฅ๊ฐ๊ณผ ์ค์ Query๋ฌธ์ ์ฐ๊ฒฐํ๋ `Controller`, ์ค์ Query๋ฌธ์ ์์ฑํ๋ `Model` Layer๋ก ๋๋์ด ์งํ ํด ๋ณด๋๋ก ํ ๊ฒ์ด์์.
`Spring`์ MVC ๋ฐฉ์๊ณผ ๋ค๋ฅด๋ค๋ณด๋ ๋ง์ด ํท๊ฐ๋ฆฌ๋ ๊ฒ์ด์์.
๐ฝ ์ด๊ธฐ ๊ตฌ์ฑ
์ต์ด VSCODE์ ๊ฐ์ IDE๋ฅผ ์ด์ฉํด์ ํฐ๋ฏธ๋์ ์ด๊ณ , ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ ์ด๊ธฐ ํ๊ฒฝ์ ๊ตฌ์ถํด ์ค ๊ฒ์ด์์. ๊ทธ๋ ๊ฒ ๋๋ฉด `package.json` ํ์ผ์ด ์์ฑ๋๋๋ฐ, ์ด ํ์ผ์ `Spring` `Gradle`์์๋ `build.gradle` `Mavne`์์๋ `pom.xml`๊ณผ ๊ฐ์ด `dependency` ์ ๋ณด์ ํ๋ก์ ํธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํ์ผ๋ก ์ด ์น๊ตฌ๋ฅผ ํตํด ํด๋น ํ๋ก์ ํธ์์ ์ด์ฉํ๋ Package๋ฅผ ๊ด๋ฆฌ ํ ์ ์๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
npm init
์ฃผ๋ํ๋์ ์์ ๊ฐ์ด ํ๊ฒฝ ๊ตฌ์ฑ์ ํด ์ค ๊ฒ์ด์์.
์๋ฃ๊ฐ ๋๋ฉด ์์ ๊ฐ์ด `package.json`์ด ๋ง๋ค์ด์ง๊ฒ ๋๋๋ฐ, ์์ง ์ถ๊ฐ Package๋ฅผ ์ค์นํ์ง ์์๊ธฐ ๋๋ฌธ์ `dependency` ๊ด๋ จ ๋ด์ฉ์ ์๋ ๊ฒ์ด์์.
๐ฆ Express.js ์ค์น
๋ช ๋ น์ด
npm install express --save
npm i express --save
`Express.js`๋ฅผ ์ค์นํ ๋ ์์ ๋๊ฐ์ง ์ค ํ ๊ฐ์ง ๋ช ๋ น์ ์ฐ๋ฉด ๋๋๋ฐ, `i`์ `install`์ ์ฐจ์ด๋ ๊ทธ๋ฅ `i`๋ก ์งง๊ฒ ์ด ๊ฒ์ด์์.
๋ํ, `--save` Option์ ์ฐ๋ฆฌ๊ฐ Git์ ์ด์ฉํ์ฌ ํ๋ก์ ํธ ๊ด๋ฆฌ๋ฅผ ํ๊ฒ ๋๋๋ฐ, ๋์ค์ Package ๋ค์ ์ค์นํ๊ฒ ๋๋ฉด ๋ง๋ค์ด์ง `node_modules`๋ผ๋ Directory ์ฆ, ์๋ `Spring` ๊ฐ์ด Package๋ Library๋ฅผ ๋ณด๊ดํ๋ Repository์ ๋ง์ ๊ฒ๋ค์ด ๋ง๋ค์ด์ง๋๋ฐ, ์ด๊ฒ์ Git์ ์ฌ๋ฆฌ๋ฉด ํจ์จ์ฑ์ด ๋จ์ด์ง๋ `.gitignore`์ `node_modules`๋ฅผ ๋ฑ๋กํ๊ณ , ์ฐจ ํ ๋ค๋ฅธ ์ฌ๋์ด๋, ๋ด๊ฐ ๋ค๋ฅธ ํ๊ฒฝ์์ ํด๋น Project๋ฅผ ๋ด๋ ค ๋ฐ์์ ๋, `$ npm install` ๋ช ๋ น์ด ํ๋๋ก `package.json`์ `dependency`๋ก ์์ฑ๋ ํ๊ฒฝ ๊ตฌ์ฑ์ ๋ค์ ํ ์ ์๊ฒ ํ๊ธฐ ์ํ Option์ธ ๊ฒ์ด์์.
Spring์ Library Repository
์์ ๊ฐ์ด `package.json`์ `dependencies`๋ก `Express.js`์ด ์ถ๊ฐ ๋์๊ณ , `node_modules` Directory๊ฐ ๋ง๋ค์ด ์ง ๊ฒ์ด์์.
๐ฆ Express.js ๋์ ํ์ธ
`Express.js`๊ฐ ์ค์น ๋์์ผ๋ Server๋ฅผ ์คํ์์ผ ์ ๋์ํ๋์ง ํ์ธ ํด๋ด์ผ ํ๋ ๊ฒ์ด์์.
์ต์ด `app.js`(JAVA์ Main()์ด ์๋ Class์ ๋น์ท)๋ฅผ ํตํด ์ฝ๋๋ฅผ ๋ฃ์ด ๋ณผ ๊ฒ์ด์์.
`app.js`๋ ํด๋น ํ๋ก์ ํธ Direcotry ์ต์์์ ๋ง๋ค์ด์ค์ผ ํ๋ค๋ ๊ฒ์ ์์ผ๋ฉด ์๋๋ ๊ฒ์ด์์.
`app.js`๋ฅผ ์์ ๊ฐ์ด ์์ฑํ๊ณ , ๋ฐ๋์ ์ ์ฅ์ ํด์ค์ผ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ์ด์ ์คํ์ ์์ผ๋ณผ ๊ฒ์ธ๋ฐ, ์๋ ๋ฐฉ๋ฒ์ผ๋ก Server๋ฅผ ๊ตฌ๋ํ ์ ์๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
node app.js
์์ ๊ฐ์ด `$node` ๋ช ๋ น์ด๋ฅผ ์จ๋ ๋์ง๋ง, ์ด๋ ๊ฒ ํ๋ฉด Code๋ฅผ ์์ ํ๋ฉด Server๋ฅผ ๋ด๋ ธ๋ค๊ฐ ๋ค์ `$node` ๋ช ๋ น์ด๋ก ๊ตฌ๋ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ด์์.
๊ทธ๋์ ์ฃผ๋ํ๋์ `nodemon`์ ์ค์นํด์ ๊ตฌ๋ํด ๋ณผ ๊ฒ์ด์์.
์ค์น ๋ช ๋ น์ด
npm i nodemon --save
์๋ฒ ๊ตฌ๋ ๋ช ๋ น์ด
nodemon app.js
Server๊ฐ ์์ฃผ ์ ๊ตฌ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
Browser๋ฅผ ํตํด ํ์ธ ํด ๋ณด์๋ ์์ฃผ ์ ๊ตฌ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๋ค์ Posting์์๋ DB๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถ ํด ๋ณด๊ณ , ๊ณต์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค!
์ฐธ๊ณ ์๋ฃ : [Node.js] Express + MySQL๋ก REST API ๋ง๋ค๊ธฐ (1)