[BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ : DB ์ฐ๊ฒฐ
๐ ๋ชฉ์ฐจ
โ [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'
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ MySql ์ฐ๊ฒฐ
๐ฝ MySql Driver ์ค์น
์ต์ด `Express.js`์ `MySql`์ ์ฐ๊ฒฐํ๊ธฐ ์ํด `MySql` Driver๋ฅผ ์ค์นํด์ผ ํ๋ ๊ฒ์ด์์.
`Spring`์์๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด `pom.xml`์ด๋, `build.gradle`์ `dependency`๋ฅผ ์ถ๊ฐ ํด์ฃผ๋ฉด ๋์ง๋ง, `Node.js`์์๋ ์ค์น๋ฅผ ํด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์์.
๋ช ๋ น์ด
npm i mysql --save
Project Directory์์ ์์ ๋ช ๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์ ๋ ฅํ์ฌ Driver๋ฅผ ์ค์นํด ์ค ๊ฒ์ด์์.
๐ฝ Data Base ์ฐ๊ฒฐ
์ต์ด `app.js` ํ์ผ์ ์๋ ๋ด์ฉ์ ์ ๋ ฅํ์ฌ Data Base์ ์ฐ๊ฒฐํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ณผ ๊ฒ์ด์์. `MySql` ์์ `createConnection()`์ ์ด์ฉํ์ฌ Data Base ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ ๊ฒ์ด์์.
`$node app.js`๋ฅผ ์ด์ฉํด์ ์๋ฒ๋ฅผ ๊ตฌ๋์์ผฐ๋ค๋ฉด ์์ ์ฝ๋๋ฅผ ์ถ๊ฐํ ๋ค ๋ค์ ์๋ฒ๋ฅผ ๊ป๋ค๊ฐ ๋ช ๋ น์ด๋ฅผ ๋ ์ ๋ ฅํด์ ๊ตฌ๋์์ผ์ผ ํ์ง๋ง, ์ฃผ๋ํ๋์ ์ต์ด `nodemon`์ ์ด์ฉํด์ ์๋ฒ๋ฅผ ๊ตฌ๋์ํจ ๊ฒ์ด์์. ์ด๋ ๊ฒ ํ๋ฉด ์์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ , ์ ์ฅ๋ง ํ๋ฉด Server๊ฐ ์์์ ์ฌ ๊ตฌ๋ ๋๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด Data Base ์ฐ๊ฒฐ์ ์ฑ๊ณตํ ๊ฒ์ ์ ์ ์๋ ๊ฒ์ด์์.
๐ฆ Table ์์ฑ
`Spring`์์ JPA๋ฅผ ์ด์ฉํ๋ค๋ฉด `Entity`๋ฅผ ๋ง๋ค๊ณ , `applicaton.yml`์ด๋, `application.properties`์
์์ ๊ฐ์ด `ddl-auto` ์ค์ ์ `create`๋, `update`๋ฅผ ํ๋ฉด ์๋์ผ๋ก Table์ด ์์ฑ๋๊ณ , ๋๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก `/resouces` ๋ฐ์ `xx.sql` ํ์ผ์ ๋ง๋ค๊ณ , `DDL` SQL๋ฌธ์ ์ ๋ ฅํ๋ฉด Table์ ์์ฑํ ์ ์๋๋ฐ, `Spring`์ ๋๋ฒ์งธ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๊ฒ `Node.js`์์๋ `app.js`์ `DDL` SQL๋ฌธ์ ์์ฑํ์ฌ Table์ ๋ง๋ค ์ ์๋ ๊ฒ์ด์์.
์์ ๊ทธ๋ฆผ 32 ~ 46๋ฒ์งธ ์ค์ ์ ๋ ฅํ์ฌ ์ ์ฅ์ ํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
์์ ๊ทธ๋ฆผ ๋ฐ์์ 4๋ฒ์งธ ์ค์ ์ฃผ๋ํ๋์ด ๋ง๋ `test_board` Table์ด ์ ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๐ฝ MySQL ์ฐ๊ฒฐ ๊ฐ์ฒด ๋ชจ๋ํ
์ด์ ์ฐ๋ฆฌ๋ Data Base ์ฐ๊ฒฐ ๋ฐฉ๋ฒ๊ณผ Query ์ ์ก ๋ฐฉ๋ฒ์ ์๊ฒ ๋ ๊ฒ์ด์์.
์ด์ `MySQL ์ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ํ` ํด๋ณด๋๋ก ํ ๊ฒ์ด์์.
๋ง์ฝ ๋ชจ๋ํํด์ ์ฌ์ฉํ์ง ์์ผ๋ฉด `Express.js Route`์์ Data Base์ ์ด๋ค Data๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ๋ง๋ค `MySQL` ์ ์ Code๋ฅผ ๊ณ์ ์ ์ด์ค์ผ ํ๋ ๋ถํธํจ์ด ์๊ธธ ๊ฒ์ด์์.
์ด๋ฅผ ๋ง๊ธฐ ์ํด `config`๋ผ๋ Directory๋ฅผ ๋ง๋ค๊ณ , ํด๋น Directory์์ `mysql.js`๋ฅผ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
`app.js`์์๋ Data Base ์ฐ๊ฒฐ์ ๋ํด ์์ ํ์ง ์๊ฒ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์์ ์์ฑํ ๋ด์ฉ์ ๋ชจ๋ ์ง์ฐ๊ณ , ์๋ Code๋ฅผ `mysql.js`์ ์์ฑํ ๊ฒ์ด์์.
`mysql.js`์ 1๋ฒ์งธ ์ค์ `mysql Driver`๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค 4 ~ 17๋ฒ์งธ ์ค๊น์ง `Data Base`์ ์ฐ๊ฒฐํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ก ์์ฑํ ๊ฒ์ด์์.
์์์ ์์ฑํ ๊ฐ์ฒด๋ฅผ ํตํด 19 ~ 28๋ฒ์งธ ์ค๊น์ง Data Base์ ์คํจ ์ฐ๊ฒฐ์ ์๋ํ๋ ๊ฒ์ด์์.
์ฐ๊ฒฐ์ ์คํจํ๋ฉด 23๋ฒ์งธ if๋ฌธ์ผ๋ก ๋ค์ด๊ฐ์ Error ๋ด์ฉ์ ์ถ๋ ฅํ ๊ฒ์ด๊ณ , ์๋๋ผ๋ฉด 26๋ฒ์งธ ์ค ๋ด์ฉ์ ์ถ๋ ฅํด ์ค ๊ฒ์ด์์.
Data Base์ ์์ ์ด ๋๋๋ฉด ์ฐ๊ฒฐ์ ํด์ ํด์ฃผ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด์์. `Spring Boot`์์ `JPA`๋, `MyBatis`๋ ์๋์ผ๋ก ํด์ ๋ฅผ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ํด์ ๊ตฌ๋ฌธ์ ์์ฑํ์ง ์์ง๋ง, JAVA์์ `JDBC`๋ฅผ ์ด์ฉํ์ฌ Data Base๋ฅผ ์ด์ฉํ ๋ ๋ฐ๋์ ์ข ๋ฃ ๊ตฌ๋ฌธ์ ์์ฑํด ์ค์ผ ํ๋ ๊ฒ์ด์์. ์ด๋ฅผ ์ํด 30 ~ 39๋ฒ์งธ ์ค๋ก ์ฐ๊ฒฐ์ ๋์ด์ฃผ๋ ๊ฒ์ด์์.
๋ง์ง๋ง์ผ๋ก 41๋ฒ์งธ ์ค์ ์์ฑํ Data Base ์ฐ๊ฒฐ์ ์ํ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ํํ์ฌ ์ธ๋ถ ํ์ผ์์ ๋ถ๋ฌ์ ์ฌ์ฉํ ์ ์๋๋ก export(๋ด๋ณด๋ด๊ธฐ) ํด ์ค ๊ฒ์ด์์.
๐ฝ Data Base ์ฐ๊ฒฐ ์ ๋ณด ์จ๊ธฐ๊ธฐ
`Spring Boot`์ ์ด์ฉํด์ Coding์ ํ ๋, Data Base ์ ์ ์ ๋ณด๋ฅผ `application.yml`์ด๋, `application.properties`์ ์์ฑํ๊ณ , ์ด๋ฅผ Git Hub์ ์ฌ๋ผ๊ฐ์ง ์๋๋ก `.gitignore`์ ๋ฑ๋ก์ ํ๊ฑฐ๋, `jasypt` ๋ฑ์ ์ด์ฉํด์ ์ ๋ณด๋ฅผ ์จ๊ธธ ์ ์๋ ๊ฒ์ด์์.
๊ทธ๋ ๋ค๋ฉด `Node.js`์์๋ ์ด๋ค ๋ฐฉ๋ฒ์ ์ด์ฉํ ์ ์์๊น์?
`Node.js`์์๋ `dotenv`๋ฅผ ์ด์ฉํ์ฌ ํ๊ฒฝ ๋ณ์์ฉ ํ์ผ์ ๋ฐ๋ก ๋ง๋ค์ด ๊ด๋ฆฌํ ์ ์๋ ๊ฒ์ด์์. ๊ทธ๋ผ ์ด ํ์ผ์ `.gitignore`์ ๋ฑ๋กํ๋ฉด? Data Base ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์งํฌ ์ ์๋ ๊ฒ์ด์์.
์ค์น ๋ช ๋ น์ด
npm i dotenv --save
๐ฆ ํ๊ฒฝ ๋ณ์ ์ค์
`dotenv`๋ Project ์ต์์ ๊ฒฝ๋ก์ `.env`์์ ๋ณ์๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์น๊ตฌ์ธ ๊ฒ์ด์์.
๊ทธ๋ ๋ค๋ฉด ์ฃผ๋ํ๋์ `.env`๋ฅผ ๋ง๋ค์ด์ผ ๊ฒ ์ด์! ๐ง๐ป๐ป
์ฐธ๊ณ ๋ก `.env` ํ์ผ์์๋ ๊ฐ ๋ณ์์ ๊ฐ์ด ์๋์ผ๋ก ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์์ ๋ฐ์ดํ(')๋, ํฐ ๋ฐ์ดํ(")๋ก ๋ฌถ์ผ๋ฉด ์๋๋ ๊ฒ์ด์์.
๐ฆ ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
์ด์ Data Base๋ฅผ ๋ค์ ์ฐ๊ฒฐ๋ ์ ์๋๋ก ํ๊ฒฝ ๋ณ์๋ฅผ ์ด์ฉํด์ผ ๋๋ ๊ฒ์ด์์.
`.env`์ ๋ฑ๋ก๋ ํ๊ฒฝ ๋ณ์๋ `process.env.{๋ณ์๋ช }`์ผ๋ก ์ ๊ทผํ ์ ์๋ ๊ฒ์ด์์.
`mysql.js`์ `mysql.createConnection`๋ถ๋ถ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๊ณ ์ณ๋ณผ ๊ฒ์ด์์.
์์ ๊ทธ๋ฆผ 10 ~ 14๋ฒ์งธ ์ค์ ๋ณด๋ฉด ๋ณํ๊ฐ ์๋ ๊ฒ์ ์ ์ ์๋ ๊ฒ์ด์์.
๐ฝ Data Base ์ฐ๊ฒฐ
๋ค์ Data Base์ ์ ์์ ์ผ๋ก ์ฐ๊ฒฐ์ ์ํด `app.js`์์ ์ ์์ ์ผ๋ก ๋ถ๋ฌ์ Data Base ์ ์์ด ์ ๋๋์ง ํ์ธ ํด ๋ณผ ๊ฒ์ด์์.
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ต์ด 3๋ฒ์งธ ์ค์ `dotenv`๋ฅผ ๋ถ๋ฌ์ค๊ณ , `config()`๋ฅผ ํธ์ถํด์ค์ผ ํ๋ ๊ฒ์ด์์. `MySQL` ์ฐ๊ฒฐ ์ ๋ณด ๋ฑ์ ๊ฐ์ง๊ณ ์๋ `mysql.js`๋ฅผ import ์ํค๊ณ , ๊ทธ๊ฒ์ ๊ฐ์ฒดํ ํ์ฌ `mysql.js`์ `init()`์ ํธ์ถ ํ์ฌ Data Base๋ฅผ ์ฐ๊ฒฐ ํ ๋ค 9๋ฒ์งธ ์ค์ `open()`์ ์ด์ฉํด์ Data Base ์ฐ๊ฒฐ์ ์๋ํ๋๋ก ํด ์ค ๊ฒ์ด์์.
์ ๋ฌธ์ ๋ '์ด ๊ณณ'์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํ์ธ ํ์ค ์ ์๋๋ก ์ค๋น ํด ๋ ๊ฒ์ด์์.
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ ์์ ์ผ๋ก Server๊ฐ ๊ตฌ๋ ๋์์ต๋๋ค.
๐ .gitignore ์์ฑ
์์์ ์ด์ผ๊ธฐ ํ๋ฏ Data Base ์ฐ๊ฒฐ ์ ๋ณด๋ Git Hub์ ์ฌ๋ผ๊ฐ์ง ์๋๋ก ์์ ์ ํด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ https://www.toptal.com/developers/gitignore ์ด ๊ณณ์์ Git Hub์ ์ฌ๋ผ๊ฐ๋ฉด ์๋๋ ๊ฒ๋ค์ ์์ฝ๊ฒ ๋ฐ์๋ณผ ๊ฒ์ด์์.
์ด๋ ๊ฒ ์ด์ฉํ๋ OS์ ๊ธฐํ ์ฌ๋ผ๊ฐ์ง ์์์ผ๋ฉด ํ๋ ๊ฒ๋ค์ ์ ์ ๋ค '์์ฑ'์ ๋๋ฌ ํ์ธ ํด ๋ณผ ๊ฒ์ด์์.
์ ๋ด์ฉ์ ๋ชจ๋ ๊ธ์ด Project ์ต์์์ `.gitignore`์ ๋ง๋ค๊ณ , ๋ด์ฉ์ ๋ถํ๋ฃ๊ธฐ ํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ Data Base ์ ์ ์ ๋ณด๊ฐ ๋ค์ด์๋ `.env`์ ์์ฒญ๋๊ฒ ๋ง์ `node_modules` ๊ทธ๋ฆฌ๊ณ , MacOS๋ฅผ ์ด์ฉํ๋ฉด ์ธ๋ฐ์์ด ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋ `.DS_Sotre`๋ฅผ ์ ์ธํ๊ณ ์ถ์๊ณ , ์์ ๊ฐ์ด ์ ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
์ด์ push๋ฅผ ํด ๋ณผ๊ฒ์ด์์.
์ํ๋๋๋ก ์ ์ฌ๋ผ๊ฐ ๊ฒ์ด์์. ๐ ๐
์ฐธ๊ณ ์๋ฃ : [Node.js] Express + MySQL๋ก REST API ๋ง๋ค๊ธฐ (2)
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."