๐ํค์๋: ๋ฐ์ดํฐ๋ฒ ์ด์ค, MySQL, CRUD, Sequelize, ๋ชจ๋ธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: ๊ด๋ จ์ฑ์ ๊ฐ์ง๋ฉฐ ์ค๋ณต์ด ์๋ ๋ฐ์ดํฐ๋ค์ ์งํฉ
- DBMS: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ
- RDBMS(Relational DBMS): ๊ด๊ณํ DBMS๋ก Oracle, MySQL, MSSQL ๋ฑ์ด ์๋ค.
โป ์ด์์ฒด์ ์ ๋ฐ๋ผ ์ฑ ์ ์ฐธ๊ณ ํด ์ค์น
- MySQL ๋ช ๋ น ํ๋กฌํํธ๋ก ์ ์
์ค์น๋ ํด๋ ๊ฒฝ๋ก๋ก ์ด๋ → (์ฝ์) mysql -h localhost -u root -p ์ ๋ ฅ
https://dev.mysql.com/downloads/workbench/
MySQL ํ๋กฌํํธ์ ์ ์ํด → ex) CREATE SCHEMA 'nodejs' DEFAULT CHARACTER SET utf8mb4 DEFA
ULT COLLATE utf8mb4_general_ci; ์
๋ ฅ
- ํ๊ธ๊ณผ ์ด๋ชจํฐ์ฝ ์ฌ์ฉ์ ์ํด DEFAULT CHARACTER SET utf8mb4 DEFA
ULT COLLATE utf8mb4_general_ci
- SQL๊ตฌ๋ฌธ์ ์ ๋ ฅํ ํ ๋ง์ง๋ง์ ์ธ๋ฏธ์ฝ๋ก (;) ๋ถ์ฌ์ฃผ๊ธฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ: use [๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช ];
2. ํ ์ด๋ธ ์์ฑํ๊ธฐ
//์์ - ์ฌ์ฉ์ ํ
์ด๋ธ
CREATE TABLE nodejs.users (
-> id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(20) NOT NULL,
-> age INT UNSIGNED NOT NULL,
-> married TINYINT NOT NULL,
-> comment TEXT NULL,
-> created_at DATETIME NOT NULL DEFAULT now(),
-> PRIMARY KEY(id),
-> UNIQUE INDEX name_UNIQUE (name(ASC))
-> COMMENT = '์ฌ์ฉ์ ์ ๋ณด'
-> ENGINE = InnoDB;
โป์คํ ์ฃผ์
- ํ ์ด๋ธ ์์ฑ: CREATE TABLE [๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช .ํ ์ด๋ธ๋ช ];
- ์๋์ ํ ์ค์ฉ ์ฝค๋ง๋ก ๊ตฌ๋ถํด ์ปฌ๋ผ(์ธ๋ก์ค)์ ๋ง๋ ๋ค.
- ์๋ฃํ: INT(์ ์ํ), VARCHAR(์๋ฆฟ์), TINYINT, TEXT(๊ธด ๊ธ ์ ์ฅ ์), DATETIME(๋ ์ง์ ์๊ฐ) ๋ฑ
- ์ปฌ๋ผ ์ค์ : NOT NULL(๋น์นธ ํ์ฉํ์ง ์์), NULL(๋น์นธ ํ์ฉ), UNSIGNED(์์ ๋ฌด์), AUTO_INCREMENT(์ซ์๋ฅผ ์ ์ ๋ก ์ฌ๋ฆผ), ZEROFILL(์ซ์์ ์๋ฆฟ์๊ฐ ๊ณ ์ ๋์ด ์์ ๋-๋น์ด์๋ ์๋ฆฌ์ ๋ชจ๋ 0), DEFAULT(๊ธฐ๋ณธ๊ฐ), PRIMARY KEY(๊ธฐ๋ณธํค-๊ณ ์ ํ ์๋ณ์), UNIQUE INDEX(ํด๋น ๊ฐ์ด ๊ณ ์ ํด์ผ ํจ) ๋ฑ์ ์ต์
- ํ ์ด๋ธ ์์ฒด์ ๋ํ ์ค์ : COMMENT(ํ ์ด๋ธ ๋ณด์ถฉ ์ค๋ช ), ENGINE
- ํ ์ด๋ธ ํ์ธ ๋ช ๋ น: DESC [ํ ์ด๋ธ๋ช ];
- ํ ์ด๋ธ ์ ๊ฑฐ ๋ช ๋ น: DROP TABLE [ํ ์ด๋ธ๋ช ];
- ๋ค๋ฅธ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค๋ฅผ ์ ์ฅํ๋ ์ปฌ๋ผ: ์ธ๋ํค(foreign key)
CONSTRAINT [์ ์ฝ์กฐ๊ฑด๋ช ] FOREIGN KEY [์ปฌ๋ผ๋ช ] REFERENCES [์ฐธ๊ณ ํ๋ ์ปฌ๋ผ๋ช ]
- CASCADE: ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์์ ๋๊ฑฐ๋ ์ญ์ ๋๋ฉด ๊ทธ๊ฒ๊ณผ ์ฐ๊ฒฐ๋ ๋๊ธ ์ ๋ณด๋ ๊ฐ์ด ์์ ํ๊ฑฐ๋ ์ญ์
- ํ ์ด๋ธ ํ์ธ: SHOW TABLES;
โป ์ํฌ๋ฒค์น ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ฑ ์ฐธ๊ณ
์ํ๋ผ์ด์ฆ(Sequelize)
- MySQL ์์ ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ORM(์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฆด๋ ์ด์ ์ ๋งคํํด ์ฃผ๋ ๋๊ตฌ)์ผ๋ก ๋ถ๋ฅ
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์์์ SQL๋ก ๋ฐ๊ฟ์ค๋ค.
//์ํ๋ผ์ด์ฆ์ ํ์ํ ํจํค์ง ์ค์น
npm i express morgan numjucks sequelize sequelize-cli mysql2
npm i -D nodemon
//์ค์น ์๋ฃ ํ
npx sequelize init
→ ์์ ๋ช ๋ น์ด ์คํํ๋ฉด config, models, migrations, seeders ํด๋ ์์ฑ
โ MySQL ์ฐ๊ฒฐํ๊ธฐ
- app.js ์์ฑํ๊ณ → ์ต์คํ๋ ์ค์ ์ํ๋ผ์ด์ฆ ์ฐ๊ฒฐ ์ฝ๋ ์์ฑ
//apps.js
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');
const { sequelize } = require('./models');
const indexRouter = require('./routes');
const usersRouter = require('./routes/users');
const commentsRouter = require('./routes/comments');
const app = express();
app.set('port', process.env.PORT || 3001);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});
sequelize.sync({ force: false })
.then(() => {
console.log('๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต');
})
.catch((err) => {
console.error(err);
});
app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/comments', commentsRouter);
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} ๋ผ์ฐํฐ๊ฐ ์์ต๋๋ค.`);
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
//config/config.json-> ๊ฐ์ธ์ ์ค์ ์ ๋ง๊ฒ ์์
{
"development": {
"username": "root",
"password": "[password]",
"database": "nodejs",
"host": "127.0.0.1",
"dialect": "mysql"
},
→ ์์ ๋ ์ฝ๋ ์์ ํ (ํ๋กฌํํธ)npm start๋ก ์๋ฒ ์คํํ๋ฉด 3001 ํฌํธ์์ ์๋ฒ๊ฐ ๋์๊ฐ๋ค.
โก ๋ชจ๋ธ ์ ์ํ๊ธฐ
MySQL์์ ์ ์ํ ํ ์ด๋ธ์ ์ํ๋ผ์ด์ฆ์์๋ ์ ์ํด์ผ ํ๋ค.
//models/user.js
const Sequelize = require('sequelize');
class User extends Sequelize.Model {
static initiate(sequelize) {
User.init({
name: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true,
},
age: {
type: Sequelize.INTEGER.UNSIGNED,
allowNull: false,
},
married: {
type: Sequelize.BOOLEAN,
allowNull: false,
},
comment: {
type: Sequelize.TEXT,
allowNull: true,
},
created_at: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
sequelize,
timestamps: false,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: false,
charset: 'utf8',
collate: 'utf8_general_ci',
});
}
static associate(db) {
db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
}
};
module.exports = User;
→ ์๋ฃํ, ์ต์ ๋ฑ์ ํํ๊ฐ ๋ค๋ฅด๋ค.
- ๋ชจ๋ธ.init ๋ฉ์๋์ ๋ ๋ฒ์งธ ์ธ์๋ ํ ์ด๋ธ ์ต์ ์ด๋ค.
- sequelize: db.sequelize ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ผ ํ๋ค, static initiate ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ์ฐ๊ฒฐ
- timestamps, underscored, modelName, tableName, paranoid, charset๊ณผ collate(ํ๊ธ๋ก ์ค์ ) ๋ฑ
+ Comment ๋ชจ๋ธ๋ ๋ง๋ค๊ณ models/index.js์ ์ฐ๊ฒฐํ๊ธฐ
//models/index.js
const Sequelize = require('sequelize');
const User = require('./user');
const Comment = require('./comment');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.User = User;
db.Comment = Comment;
User.initiate(sequelize); //๊ฐ๊ฐ์ ๋ชจ๋ธ์ static initiate ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ
Comment.initiate(sequelize);
User.associate(db);
Comment.associate(db);
module.exports = db;
→ db ๊ฐ์ฒด์ User์ Comment ๋ชจ๋ธ์ด ๋ด๊ฒจ์๋ค. (์ฆ, db ๊ฐ์ฒด๋ฅผ require ํด์ User์ Comment ๋ชจ๋ธ์ ์ ๊ทผํ ์ ์๋ค.)
โข ๊ด๊ณ ์ ์ํ๊ธฐ
- ์ผ๋๋ค, ์ผ๋์ผ, ๋ค๋๋ค ๊ด๊ณ๊ฐ ์๋ค.
- 1:N
→ require ๋ฐฉ์(์ํ ์ฐธ์กฐ)์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด index.js์์ ๊ฐ ๋ชจ๋ธ์ ๋ถ๋ฌ์ db ๋งค๊ฐ๋ณ์๋ก ๋๊ธฐ๋ ๋ฐฉ์์ ์ทจํ๋ค.
→ ๋ค๋ฅธ ๋ชจ๋ธ์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ ํ ์ด๋ธ์๋ belongsTo ์ฌ์ฉ
→ hasMany ๋ฉ์๋์์๋ source ์์ฑ์ id, belongsTo ๋ฉ์๋์์๋ targetKey ์์ฑ์ id๋ฅผ ๋ฃ๋๋ค.
- foreignKey๋ฅผ ๋ฐ๋ก ์ง์ ํ์ง ์์ผ๋ฉด '๋ชจ๋ธ๋ช +๊ธฐ๋ณธ ํค'์ธ ์ปฌ๋ผ์ด ๋ชจ๋ธ์ ์์ฑ๋๋ค.
- npm start ๋ช ๋ น์ด๋ก ์๋ฒ๋ฅผ ์คํํ๋ฉด ์ค์ค๋ก SQL๋ฌธ์ ์คํํ๋ค.
- 1:1
- hasOne ๋ฉ์๋ ์ฌ์ฉ
ex) db.User.hasOne(db.Info, { foreignKey: 'UserId', sourceKey: 'id' });
- N:M
- belongsToMany ๋ฉ์๋ ์ฌ์ฉํ๋ค.(์์ชฝ ๋ชจ๋ธ ๋ชจ๋์)
- ์๋ก์ด ๋ชจ๋ธ์ด ์์ฑ๋๋ค.
→ ์๋์ผ๋ก ๋ง๋ค์ด์ง ๋ชจ๋ธ์ ์ ๊ทผํ๊ธฐ ์ํด db.sequelize.models.PostHashtag
โฃ ์ฟผ๋ฆฌ ์์๋ณด๊ธฐ
- ์ฟผ๋ฆฌ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ฏ๋ก then์ ๋ถ์ฌ ๊ฒฐ๊ด๊ฐ์ ๋ฐ์ ์ ์๋ค.
- models ๋ชจ๋์์ User ๋ชจ๋ธ์ ๋ถ๋ฌ์ create ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
โป MySQL ์๋ฃํ์ด ์๋ ์ํ๋ผ์ด์ฆ ๋ชจ๋ธ์ ์ ์ํ ์๋ฃํ๋๋ก ๋ฃ์ด์ผ ํ๋ค. (๋ถํฉํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์์ ๋ ์๋ฌ ๋ฐ์)
- ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ๋ findAll ๋ฉ์๋ ์ฌ์ฉ
- attributes ์ต์ (์ํ๋ ์นผ๋ผ๋ง) , where ์ต์ (์กฐ๊ฑด), order ์ต์ (์ ๋ ฌ), limit ์ต์ (๊ฐ์ ์ค์ ), offset ์์ฑ, update ๋ฉ์๋, destroy ๋ฉ์๋(๋ก์ฐ ์ญ์ )
- 0p ๊ฐ์ฒด: 0p . gt(์ด๊ณผ), 0p . or(๋๋) ๋ฑ
- (ํ์ฌ User ๋ชจ๋ธ)
- ํน์ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์ค๋ฉด์ ๊ทธ ์ฌ๋์ ๋๊ธ๊น์ง ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด include ์์ฑ(include ๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค)์ ์ฌ์ฉํ๋ค.
- ๊ด๊ณ ์ค์ ํ getComments(์กฐํ), setComments(์์ ), addComment(ํ๋ ์์ฑ), addComments(์ฌ๋ฌ ๊ฐ ์์ฑ), removeComments(์ญ์ ) ๋ฉ์๋๋ฅผ ์ด์ฉ๊ฐ๋ฅํ๋ค.
- ๋ชจ๋ธ์ ์ด๋ฆ ๋ฐ๊พธ๋ ค๋ฉด as ์ฌ์ฉํ๋ฉด ๋๋ค.
- where, attributes ์ต์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
→ ์ฟผ๋ฆฌ ์กฐํ
- ์ถ๊ฐ๋ ์์ด๋๋ฅผ ์ด์ฉํด ๋ฐฐ์ด๋ก ๊ฐ๋ฅํ๋ค. ์์ , ์ญ์ ๋ ๋ง์ฐฌ๊ฐ์ง
- SQL๋ฌธ์ ํตํด ์ฟผ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
โค ์ฟผ๋ฆฌ ์์๋ณด๊ธฐ
- (๋ชจ๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํ๋ค, JSON ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.) ๋ ๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
- views/sequelize.html, error.html
- public/sequelize.js --- script ํ๊ทธ์ ๋ฒํผ์ด ๋๋ ธ์ ๋ ์๋ฒ์ ๋ผ์ฐํฐ๋ก AJAX ์์ฒญ์ ๋ณด๋ด๋ ์ฝ๋ ๋ค์ด์๋ค.
- app.js
ํ์ผ๋ค์ ๋ง๋ ๋ค.
//routes/index.js
const express = require('express');
const User = require('../models/user');
const router = express.Router();
router.get('/', async (req, res, next) => {
try {
const users = await User.findAll();
res.render('sequelize', { users });
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = router;
→ (๋ชจ๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ์ด์ง๋ฅผ ๋ ๋๋ง) User.findAll ๋ฉ์๋๋ก ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์ฐพ๊ณ , ๊ฒฐ๊ด๊ฐ์ธ users๋ฅผ ๋ฃ๋๋ค.
- ์ํ๋ผ์ด์ฆ๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ async/await ์ try/catch๋ฌธ์ ์ฌ์ฉํด์ ์ฑ๊ณต๊ณผ ์คํจ ์์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
//routes/users.js
const express = require('express');
const User = require('../models/user');
const Comment = require('../models/comment');
const router = express.Router();
router.route('/')
.get(async (req, res, next) => {
try {
const users = await User.findAll();
res.json(users);
} catch (err) {
console.error(err);
next(err);
}
})
.post(async (req, res, next) => {
try {
const user = await User.create({
name: req.body.name,
age: req.body.age,
married: req.body.married,
});
console.log(user);
res.status(201).json(user);
} catch (err) {
console.error(err);
next(err);
}
});
router.get('/:id/comments', async (req, res, next) => {
try {
const comments = await Comment.findAll({
include: {
model: User,
where: { id: req.params.id },
},
});
console.log(comments);
res.json(comments);
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = router;
→ (JSON ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค) ์ฌ์ฉ์๋ฅผ ์กฐํํ๋ ์์ฒญ๊ณผ (GET /users) ๋ฑ๋กํ๋ ์์ฒญ (POST /users)๋ฅผ ์ฒ๋ฆฌํ๋ค.
- where, include ์ต์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- routes/comments.js ํ์ผ์ ์ถ๊ฐํด ๋๊ธ๊ณผ ๊ด๋ จ๋ CRUD ์์ ์ ํ๋ค.
- ํ์ผ์ ๋ชจ๋ ์์ฑ ํ npm start๋ก ์๋ฒ๋ฅผ ์คํํ๋ค. → http://localhost:3001 ๋ก ์ ์ํด ํ์ธํ๋ค.
Quiz
1. ๊ด๋ จ์ฑ์ ๊ฐ์ง๋ฉฐ ์ค๋ณต์ด ์๋ ๋ฐ์ดํฐ๋ค์ ์งํฉ์ ( )๋ผ ํ๋ค.
2. ๋ง๋ค์ด์ง users ํ ์ด๋ธ์ ํ์ธํ๊ธฐ ์ํ ๋ช ๋ น์ด๋ ( )์ด๋ค.
3. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํํ๋ ์์ฑ, ์กฐํ, ์์ , ์ญ์ 4๊ฐ์ง ์์ ์ ( )๋ผ๊ณ ํ๋ค.
4. ์๋ฒ ์คํ ๋ช ๋ น์ด๋ ( )์ด๋ค.
5. MySQL ์์ ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ค์ค๋ก SQL๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ ( )๋ผ๊ณ ํ๋ค.
6. ์ํ๋ผ์ด์ฆ์์ hasMany๋ฉ์๋๋ก ํํํ๋ ๊ด๊ณ๋ ( )์ด๋ค.
7. ์ฟผ๋ฆฌ๋ฅผ ์ํํ ๋ ๋ชจ๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํ๋ ๋ฐฉ๋ฒ๊ณผ ( ) ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง๊ฐ ์๋ค.
8. ์๋์ ํ ์ด๋ธ(users)์ 2๊ฐ์ ๋ฐ์ดํฐ ์์ฑ์ ์ํ ๋ช ๋ น์ด๋ฅผ ์์ฑํ์์ค.
9. ๋ผ์ฐํฐ๋ฅผ ๋ง๋๋ ํ์ผ์ด๋ค. ๋น์นธ์ ์ฑ์ฐ์์ค.
//routes/index.js
const express = require('express');
const User = require('../models/user');
const router = express.Router();
router.get('/', async (req, res, next) => {
try {
const users = await User.(1. )(); //๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ชจ๋ ์ฌ์ฉ์ ์ฐพ๊ธฐ
res.render('sequelize', { (2. ) }); //sequelize.html์ ๋ ๋๋งํ ๋ ๊ฒฐ๊ณผ ๊ฐ
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = (3 ); //๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ด๋ณด๋
1. ๋ฐ์ดํฐ๋ฒ ์ด์ค
2. DESC users;
3. CRUD
4. npm start
5. ์ํ๋ผ์ด์ฆ
6. 1:N
7. JSON
8.
mysql(ํ๋กฌํํธ)> INSERT INTO nodejs.users (name, age, married, comment) VALUES ('hh', 21, 0, '์๊ธฐ์๊ฐ1');
mysql(ํ๋กฌํํธ)> INSERT INTO nodejs.users (name, age, married, comment) VALUES ('dd', 25, 0, '์๊ธฐ์๊ฐ12');
9.
//routes/index.js
const express = require('express');
const User = require('../models/user');
const router = express.Router();
router.get('/', async (req, res, next) => {
try {
const users = await User.(1. findAll )();
res.render('sequelize', { (2. users ) });
} catch (err) {
console.error(err);
next(err);
}
});
module.exports = (3. router );
์ถ์ฒ) ์กฐํ์ , ใNode.js ๊ต๊ณผ์ ๊ฐ์ 3ํใ, ๊ธธ๋ฒ(2022), 6์ฅ
Corner node.js 2ํ
Editor : Igumi
[๋ ธ๋ 2ํ] #9. ๋ชฝ๊ณ ๋๋น (3) | 2024.12.27 |
---|---|
[๋ ธ๋ 2ํ] #7. ์ต์คํ๋ ์ค ์น ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2024.11.22 |
[๋ ธ๋ 2ํ] #6. http ๋ชจ๋๋ก ์๋ฒ ๋ง๋ค๊ธฐ & ํจํค์ง ๋งค๋์ (1) | 2024.11.15 |
[๋ ธ๋ 2ํ] #5. ๋ ธ๋ ๊ธฐ๋ฅ(2) (0) | 2024.11.08 |
[๋ ธ๋ 2ํ] #4.๋ ธ๋ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ(1) (0) | 2024.10.11 |