Node.js & Express์ ์ฌ์ฉํ์ฌ ๊ฒ์ํ์ ๋ง๋ค์์ต๋๋ค.
์ด๋ณด์ ๋ถ๋ค์ ์ํด, DB๋ Mongoose(MongoDB), SQL, Sequelize๋ฅผ ์ฌ์ฉํ ๊ฒ์ํ ์ํ์ ๋ง๋ค์ด๋ดค์ต๋๋ค..
์ฝ๊ฐ์ ๋์์ด๋๋ง ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. (ํฅํ ์ผ๊ธ์ผ๊ธ ์ฌ๋ฌ ๊ธฐ์ ๋ค์ ์ถ๊ฐํด๋ณผ ์๊ฐ์
๋๋ค)
| Tech | Description | Version |
|---|---|---|
| express | ์น ํ๋ ์์ํฌ | 4.17.2 |
| mongoose | MongoDB ODM | 6.1.8 |
| mongoose-sequence | mongoose lib | 5.3.1 |
| mysql2 | MySQL | 6.1.8 |
| sequelize | MySQL ORM | 6.17.0 |
| sequelize-cli | sequelize-cli | 6.4.1 |
| ejs | ํ ํ๋ฆฟ ์์ง | 3.1.6 |
| bcrypt | ๋น๋ฐ๋ฒํธ ์ํธํ | 5.0.1 |
| joi | ์ ํจ์ฑ ๊ฒ์ฌ | 2.8.5 |
| cors | ๊ต์ฐจ ๋ฆฌ์์ค ๊ณต์ | 2.8.5 |
| dotenv | ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ | 16.0.0 |
| jsonwebtoken | ์๋ช ์ํธํ | 8.5.1 |
| prettier | ํด๋ฆฐ ์ฝ๋ | 2.6.1 |
| eslint | ํด๋ฆฐ ์ฝ๋ | 8.13.0 |
| eslint-config-prettier, eslint-plugin-prettier |
eslint, prettier ์ถฉ๋๋ฐฉ์ง | 8.5.0, 4.0.0 |
- ํน์ RDS๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ผ์ ๋ถ์ด ๊ณ์๋ค๋ฉด, ์๋์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์ ํด๋ณด์ธ์-! ์์๋๋ก ์ต๋ํ ์์ธํ๊ฒ ์ ์ด๋จ์ต๋๋ค
โบ๏ธ - RDS๋ ๋ฌด์์ธ๊ฐ (https://haksae.tistory.com/208)
- RDS ์ ํ ๋ฐ EC2์ ์ฐ๋ํ๊ธฐ (https://haksae.tistory.com/207)
- Workbench๋ก RDS ์ฐ๊ฒฐํ๊ธฐ (https://haksae.tistory.com/209)
- ํ๋ก์ ํธ ํด๋ก
$ git clone https://github.com/Haksae90/Board_sample_on_node-express.git- ํจํค์ง ์ค์น (1-3๋ฒ ์ค์ ์ํ๋ ํ๊ฒฝ์ ์ ํํ์ธ์)
$ cd Board_sample_on_node-express
$ cd 1.\ on\ Mongoose
$ npm install- ํ๊ฒฝ๋ณ์ ์ค์
- .env ์ค์
// 1-3๋ฒ ํด๋ ์์ .env ํ์ผ ์์ฑ ํ ์๋์ ๋ด์ฉ์ ๊ธฐ์
ํ ์ ์ฅํด์ฃผ์ธ์.
1. on Mongoose
PORT='์ํ๋ ํฌํธ ์ค์ '
TOKENKEY='์ํ๋ JWT ํ ํฐ ๊ฐ ์ค์ '
MONGO_URL='์ํ๋ ๋ชฝ๊ณ DB URL ์ค์ ' ex) 'mongodb://localhost:27017/board_project'
2. on MySQL
PORT='์ํ๋ ํฌํธ ์ค์ '
TOKENKEY='์ํ๋ JWT ํ ํฐ ๊ฐ ์ค์ '
mysql_host='ํ๋ก์ ํธ ํ๊ฒฝ์ HOST ์ฃผ์'
mysql_user='ํ๋ก์ ํธ ํ๊ฒฝ์ MySQL ID'
mysql_password='ํ๋ก์ ํธ ํ๊ฒฝ์ MySQL ํจ์ค์๋'
mysql_database='์ฐ๊ฒฐํ DB๋ช
'
3. on Sequelize
PORT='์ํ๋ ํฌํธ ์ค์ '
TOKENKEY='์ํ๋ JWT ํ ํฐ ๊ฐ ์ค์ '
- Sequelize config ์ค์
// sequelize๋ ์ถ๊ฐ๋ก config ์ค์ ์ ํด์ฃผ์
์ผํฉ๋๋ค.
sequelize cli ์ค์น
$npm i sequelize sequelize-cli sqlite3
sequelize CLI๋ฅผ ์ฌ์ฉํ์ฌ config, ํ
์ด๋ธ ์์ฑ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์
, ํ
์ดํฐ ์ถ๊ฐ
$npx sequelize init
// config ํ์ผ์ ์์ฑ๋๋ค๋ฉด config๋ฅผ ์ค์ ํด์ฃผ์ธ์. ๋ฉ์ธ ๋๋ ํ ๋ฆฌ์์ config ํด๋ ์์, config.json ํ์ผ์ ์๋์ ๊ฐ์ด ์
ํ
ํด์ฃผ์๋ฉด ๋ฉ๋๋ค
{
"development": {
"username": "ํ๋ก์ ํธ ํ๊ฒฝ์ MySQL ID",
"password": "ํ๋ก์ ํธ ํ๊ฒฝ์ Password",
"database": "์ฐ๊ฒฐํ DB๋ช
",
"host": "ํ๋ก์ ํธ ํ๊ฒฝ์ HOST ์ฃผ์",
"dialect": "mysql"
},
// ์๋ฒ๋ฅผ ๋๋ฆฌ๊ธฐ ์ ์ sequelize๋ก DB ์์ฑํ๋ ๊ฒ๋ ์์ง๋ง์
์
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
$npx sequelize db:migrate
- ํ์ ๊ฐ์
ํ์ด์ง
- ํ์๊ฐ์ ๋ฒํผ์ ํด๋ฆญํ๊ธฐ
- ๋๋ค์, ๋น๋ฐ๋ฒํธ, ๋น๋ฐ๋ฒํธ ํ์ธ์ ์ ๋ ฅํ๊ธฐ
- ๋๋ค์์
์ต์ 3์ ์ด์, ์ํ๋ฒณ ๋์๋ฌธ์(a~z, A~Z), ์ซ์(0~9)๋ก ๊ตฌ์ฑํ๊ธฐ - ๋น๋ฐ๋ฒํธ๋
์ต์ 4์ ์ด์์ด๋ฉฐ, ๋๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด ํฌํจ๋ ๊ฒฝ์ฐ ํ์๊ฐ์ ์ ์คํจ๋ก ๋ง๋ค๊ธฐ - ๋น๋ฐ๋ฒํธ ํ์ธ์ ๋น๋ฐ๋ฒํธ์ ์ ํํ๊ฒ ์ผ์นํ๊ธฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ๋๋ค์์ ์ ๋ ฅํ ์ฑ ํ์๊ฐ์ ๋ฒํผ์ ๋๋ฅธ ๊ฒฝ์ฐ "์ค๋ณต๋ ๋๋ค์์ ๋๋ค." ๋ผ๋ ์๋ฌ๋ฉ์ธ์ง๋ฅผ ํ๋ก ํธ์๋์์ ๋ณด์ฌ์ฃผ๊ธฐ
- ํ์๊ฐ์
๋ฒํผ์ ๋๋ฅด๊ณ ์๋ฌ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ฉด
๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋์ํค๊ธฐ
- ๋ก๊ทธ์ธ ํ์ด์ง
- ๋ก๊ทธ์ธ, ํ์๊ฐ์ ๋ฒํผ์ ๋ง๋ค๊ธฐ
- ๋๋ค์, ๋น๋ฐ๋ฒํธ ์ ๋ ฅ๋ ๋ง๋ค๊ธฐ
- ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅธ ๊ฒฝ์ฐ ๋๋ค์๊ณผ ๋น๋ฐ๋ฒํธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋ก๋๋์ง ํ์ธํ ๋ค, ํ๋๋ผ๋ ๋ง์ง ์๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด "๋๋ค์ ๋๋ ํจ์ค์๋๋ฅผ ํ์ธํด์ฃผ์ธ์"๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ํ๋ก ํธ์๋์์ ๋ณด์ฌ์ฃผ๊ธฐ
- ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฌ์ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ฉด
์ ์ฒด ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ํ์ด์ง๋ก ์ด๋์ํค๊ธฐ
- ๋ก๊ทธ์ธ ๊ฒ์ฌ
์๋ ํ์ด์ง๋ฅผ ์ ์ธํ๊ณ๋ชจ๋ ๋ก๊ทธ์ธ ํ ๊ฒฝ์ฐ๋ง ๋ณผ ์ ์๋๋ก ํ๊ธฐ- ํ์๊ฐ์ ํ์ด์ง
- ๋ก๊ทธ์ธ ํ์ด์ง
- ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ํ์ด์ง
- ๊ฒ์๊ธ ์กฐํ ํ์ด์ง
- ๋ก๊ทธ์ธ์ ํ์ง ์๊ฑฐ๋ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ฒฝ๋ก๋ก ์ ์ํ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ด ํ์ํ ๊ฒฝ๋ก์ ์ ์ํ ๊ฒฝ์ฐ "๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค." ๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ํ๋ก ํธ์๋์์ ๋์์ฃผ๊ณ
๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋์ํค๊ธฐ - ๋ก๊ทธ์ธ ํ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ์ด์ง ๋๋ ํ์๊ฐ์
ํ์ด์ง์ ์ ์ํ ๊ฒฝ์ฐ "์ด๋ฏธ ๋ก๊ทธ์ธ์ด ๋์ด์์ต๋๋ค."๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๊ณ
์ ์ฒด ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ํ์ด์ง๋ก ์ด๋์ํค๊ธฐ
- ๊ฒ์๊ธ ์กฐํ ํ์ด์ง > ๋๊ธ ๋ชฉ๋ก ์กฐํ
- ๋ก๊ทธ์ธ ํ์ง ์์ ์ฌ์ฉ์๋ ๋๊ธ ๋ชฉ๋ก ์กฐํ๊ฐ ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ
- ํ์ฌ ์กฐํ์ค์ธ ๊ฒ์๊ธ์ ์์ฑ๋ ๋ชจ๋ ๋๊ธ์ ๋ชฉ๋ก ํ์์ผ๋ก ๋ณผ ์ ์๋๋ก ํ๊ธฐ
- ๋๊ธ ๋ชฉ๋ก ์์ ๋๊ธ ์์ฑ๋ ๋ง๋ค๊ธฐ
- ๋๊ธ ์์ฑ์ ๊ดํ ๊ธฐ๋ฅ์ 5๋ฒ ์๊ตฌ์ฌํญ์ผ๋ก ์ฐ๊ฒฐํ๊ธฐ
- ๋๊ธ ๋ชฉ๋ก ์ค, ๋ด๊ฐ ์์ฑํ ๋๊ธ์ธ ๊ฒฝ์ฐ ๋๊ธ ์์ , ๋๊ธ ์ญ์ ๋ฒํผ ๋ง๋ค๊ธฐ
- ๋๊ธ ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด 6๋ฒ ์๊ตฌ์ฌํญ์ผ๋ก ์ฐ๊ฒฐํ๊ธฐ
- ๋๊ธ ์ญ์ ๋ฒํผ์ ๋๋ฅด๋ฉด 7๋ฒ ์๊ตฌ์ฌํญ์ผ๋ก ์ฐ๊ฒฐํ๊ธฐ
- ์ ์ผ ์ต๊ทผ ์์ฑ๋ ๋๊ธ์ ๋งจ ์์ ๋์ฐ๊ธฐ
- ๊ฒ์๊ธ ์กฐํ ํ์ด์ง > ๋๊ธ ์์ฑ
- ๋ก๊ทธ์ธ ํ ์ฌ์ฉ์๋ง ๋๊ธ ์์ฑ์ด ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ
- ๊ฒ์๊ธ ์กฐํ ํ์ด์ง ํ๋จ์ ๋๊ธ ๋ด์ฉ์ ์ ๋ ฅํ ์ ์๋ ๋๊ธ ์์ฑ ๋ฒํผ ๋ง๋ค๊ธฐ
- ๋ก๊ทธ์ธ ํ์ง ์์ ์ฌ์ฉ์๊ฐ ๋๊ธ ์์ฑ๋์ ๋๋ฅด๋ฉด "๋ก๊ทธ์ธ์ด ํ์ํ ๊ธฐ๋ฅ์
๋๋ค." ๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๊ณ
๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋์ํค๊ธฐ - ๋๊ธ ๋ด์ฉ๋์ ๋น์๋ ์ฑ ๋๊ธ ์์ฑ ๋ฒํผ์ ๋๋ฅด๋ฉด "๋๊ธ ๋ด์ฉ์ ์ ๋ ฅํด์ฃผ์ธ์" ๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๊ธฐ
- ๋๊ธ ๋ด์ฉ์ ์ ๋ ฅํ๊ณ ๋๊ธ ์์ฑ ๋ฒํผ์ ๋๋ฅธ ๊ฒฝ์ฐ ์์ฑํ ๋๊ธ์ ์ถ๊ฐํ๊ธฐ
- ๊ฒ์๊ธ ์กฐํ ํ์ด์ง > ๋๊ธ ์์
- ๋ด๊ฐ ์์ฑํ ๋๊ธ๋ง ์์ ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ
- ๋๊ธ ๋ณธ๋ฌธ์ด ์ฌ๋ผ์ง๊ณ , ๋๊ธ ๋ด์ฉ, ์ ์ฅ ๋ฒํผ ์์ฑํ๊ธฐ
- ๋๊ธ ๋ด์ฉ์๋ ์ด์ ์ ์ ๋ ฅํ๋ ๋๊ธ ๋ด์ฉ์ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ฑ์ฐ๊ธฐ
- ์์ ํ ๋๊ธ ๋ด์ฉ์ ๋น์ด ์์ง ์๋๋ก ํ๊ธฐ
- ์ ์ฅ ๋ฒํผ์ ๋๋ฅธ ๊ฒฝ์ฐ ๊ธฐ์กด ๋๊ธ์ ๋ด์ฉ์ ์๋ก ์ ๋ ฅํ ๋๊ธ ๋ด์ฉ์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ๊ฒ์๊ธ ์กฐํ ํ์ด์ง > ๋๊ธ ์ญ์
- ๋ด๊ฐ ์์ฑํ ๋๊ธ๋ง ์ญ์ ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ
- "์ ๋ง๋ก ์ญ์ ํ์๊ฒ ์ต๋๊น?" ๋ฉ์ธ์ง๋ฅผ ๋์ฐ๊ณ , ํ์ธ/์ทจ์ ๋ฒํผ ์ค "ํ์ธ" ๋ฒํผ์ ๋๋ฅธ ๊ฒฝ์ฐ ๋ชฉ๋ก์์ ํด๋น ๋๊ธ์ ์ญ์ ํ๊ธฐ
- ์ทจ์๋ฅผ ๋๋ฅธ ๊ฒฝ์ฐ ์ญ์ ๋์ง ์๊ณ ๊ทธ๋๋ก ์ ์งํ๊ธฐ