โ ์ฒ์์๋ ์ปดํจํฐ ๊ณผํ๊ณผ ์ด๋ก ์ ๋ฐฐ์๋ผ. ๊ทธ๋ฆฌ๊ณ ๋ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ตํ๋ผ. ๊ทธ๋ฆฌ๊ณ ๋ ๋ชจ๋ ์์ด๋ฒ๋ ค๋ผ. ๊ทธ์ ํดํนํ๋ผ. โ
- George Carrette
SIOD์ ์ฐฝ์์, hack์ ๊ฐ๋ฐ์ ๋ชฐ๋ํ๋ ๊ฒ์ ๋งํจ

sequelize-auto ๋ชจ๋
[sequelize-cli]
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ตฌ์ถ๋์ง์๋๋ผ๋, ํ๋ก์ ํธ๋ง ๋ฐ์์ ์ค์ ํ๊ณ ์๋ฒ์คํ๋ง ํ๋ฉด ์์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์์ฑํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
- ๋๊ตฐ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ๋ฐ์์ ๋น ๋ฅด๊ฒ wasํ๊ฒฝ์ ๋๋ฆด์ํฉ์ด๋ฉด ์ข์ ์ ํ์ง๋ค.
- ๋ชจ๋ธ ์ฝ๋ ์์ฑ โ ์๋ create๋ฌธ ๋ณํ โ RDB ํ ์ด๋ธ ์์ฑ
[sequelize-auto]
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๋ฏธ ๊ตฌ์ถํ ์ํ๋ผ๋ฉด, ์ธ๋ชจ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
- ์ด๋ฏธ ๊ตฌ์ถ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๋ฐํ์ผ๋ก orm ๋ชจ๋ธ์ ์๋์ผ๋ก ์์ฑํด์ค๋ค.
- ํ๋ค๊ฒ sql์ง๊ณ orm์ฝ๋ฉ ํ๋ ๋๋ฒ์ ๋ฒ๊ฑฐ๋ก์์ ์์ ์ค๋ค.
- ์ด๋ฏธ ์ง์ฌ์ง ํ ์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก โ ์๋์ผ๋ก ๋ชจ๋ธ ์ฝ๋ ์์ฑ
sequelize-auto ์ค์น
Sequelize-auto๋ Sequelize cli์ ๋ฐ๋๋ก, model์ ๋จผ์ ์์ฑํ์ง ์๊ณ , ๋๋น๋ฅผ ๋จผ์ ์์ฑํ ํ์ ์คํํด์ฃผ๋ฉด,
๋๋น์ ๋ณด๊ฐ ๋ชจ๋ธ์ ์ญ์ผ๋ก ์ ์ฅ๋๋ค.
ํ์ง๋ง sequelize-auto๋ก ์ฐ๋ํ ๊ฒฝ์ฐ created_at, update_at, defaultValue๋ฅผ ์ง์ ์ค์ ํด์ค์ผ ํ๋ค. ํ์ง๋ง workbentch์์ ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ๋ง๋ค์ด๋์์ผ๋ฉด auto๊ฐ ๊ด๊ณ๊น์ง ์ ๊ฐ์ ธ์ ํธ์ํ๊ฒ ์ฝ๋ฉ ํ ์ ์๋ค.
$ npm i sequelize-auto
GitHub - sequelize/sequelize-auto: Automatically generate bare sequelize models from your database.
Automatically generate bare sequelize models from your database. - GitHub - sequelize/sequelize-auto: Automatically generate bare sequelize models from your database.
github.com
sequelize-auto ์ฌ์ฉ
๋ง์ผ MySQL์ ์ด๋ฏธ ๋ค์๊ณผ ๊ฐ์ ํ ์ด๋ธ์ด ์์ฑ๋์ด์๋ค๊ณ ๊ฐ์ ํ์.
์๋๋๋ก๋ผ๋ฉด ์ด ํ ์ด๋ธ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ง์ผ๋์ง๋ง auto ๋ชจ๋์ ํตํด ์๋์ผ๋ก ๋ชจ๋ธ์ ์์ฑํ๊ณ Node์ MySQL์ ์ฐ๊ฒฐํ๋ ์ฝ๋๋ ์์ฑํ ๊ฒ์ด๋ค.



๋ชจ๋ธ ์๋์์ฑ ํด๋์ค ์์ฑ
์ฐ์ orm.js๋ผ๋ ํ์ผ์ ๋ง๋ค์ด์ฃผ๊ณ ์์๋ค๊ฐ sequelizeAuto ์์ฑ ํด๋์ค ๊ตฌ๋ฌธ์ ๊ธฐ์ฌํ์.
ํด๋์ค ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด์๋ค.
์ฒ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช , ์ ์ , ๋น๋ฒ์ ์ฐ๊ณ ๊ทธ๋ค์ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด๋ฅผ ์ ์ด์ฃผ๋ฉด ๋๋ค.

orm.js
const SequelizeAuto = require('sequelize-auto');
const auto = new SequelizeAuto("nodejs", "root", "123123", {
host: "127.0.0.1",
port: "3306",
dialect: "mysql",
//noAlias: true // as ๋ณ์นญ ๋ฏธ์ค์ ์ฌ๋ถ
}
);
auto.run((err)=>{
if(err) throw err;
})
๊ทธ๋ฆฌ๊ณ orm.js๋ฅผ ๋ ธ๋๋ก ์คํํ๋ฉด ๋ค์ ๋ก๊ทธ์ ํจ๊ป models ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ธ์ด ์๋ ์์ฑ๋๋ค.
$ node orm



mysql์ commentsํ ์ด๋ธ๊ณผ usersํ ์ด๋ธ์ด ๊ฐ๊ฐ comments.js์ users.js๋ชจ๋ธ๋ก ๋ณํ๋ ๊ฑธ ํ์ธ ํ ์ ์๋ค.
init-models.js๋ ๊ฐ๊ฐ ์์ฑ๋ ๋ชจ๋ธ๋ค์ ๊ด๊ณ๋ฅผ ์ค์ ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋ ์ญํ ์ ํ๋ค๊ณ ๋ณด๋ฉด๋๋ค. ์ด ์ญ์ ์๋ ์์ฑ ๋๋ค.
init-models.js
var DataTypes = require("sequelize").DataTypes;
var _comments = require("./comments");
var _users = require("./users");
function initModels(sequelize) {
var comments = _comments(sequelize, DataTypes);
var users = _users(sequelize, DataTypes);
// ๊ด๊ณ๋ฅผ ์ ์ํ๋๊ฑธ ์์ ์๋ค.
comments.belongsTo(users, { as: "commenter_user", foreignKey: "commenter"});
users.hasMany(comments, { as: "comments", foreignKey: "commenter"});
return {
comments,
users,
};
}
module.exports = initModels;
module.exports.initModels = initModels;
module.exports.default = initModels;
mysql ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
index.js์์ sequelizeAuto๋ก ๋ง๋ ๋ชจ๋ธ๊ณผ mysql ํ ์ด๋ธ์ ์๋ก ์ฐ๊ฒฐ ์์ผ์ฃผ๊ณ ๋ฆฌํดํ models๊ฐ์ฒด๋ฅผ exportํ๋ค.
๊ทธ๋ฆฌ๊ณ app.js์์ ๊ฐ์ ธ์ ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ๋ ๋ฆฌ๋ฉด ์๋๋๋๊ฑธ ํ์ธ ํ ์ ์๋ค.
index.js
const initModels = require('./init-models'); // init-models.js์์ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
const { Sequelize } = require('sequelize');
// config/config.json ํ์ผ์ ์๋ ์ค์ ๊ฐ๋ค์ ๋ถ๋ฌ์จ๋ค.
// config๊ฐ์ฒด์ env๋ณ์(development)ํค ์ ๊ฐ์ฒด๊ฐ๋ค์ ๋ถ๋ฌ์จ๋ค.
// ์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ ๋ถ๋ฌ์จ๋ค๊ณ ๋งํ ์ ์๋ค.
const env = process.env.NODE_ENV || 'development';
const config = require("../config/config.json")[env]
// new Sequelize๋ฅผ ํตํด MySQL ์ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
const sequelize = new Sequelize(config.database, config.username, config.password, config)
// ๋ชจ๋ธ๊ณผ ํ
์ด๋ธ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ง๋ค.
const models = initModels(sequelize);
module.exports = models;
app.js
const express = require('express');
const { users, comments } = require('./models/index'); // ./models/index.js์์ ์ค์ ํ ์ฐ๊ฒฐ๋ ๋ชจ๋ธ๋ค์ ๊ฐ์ ธ์จ๋ค
const app = express();
app.set('port', process.env.PORT || 3000);
app.get('*', async (req, res, next) => {
try {
const _comments = await comments.findAll({ // ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฌธ ์ฌ์ฉ
include: {
model: users,
as: "commenter_user", // ์ init-models.js์์ ์ ์ํ alias๋ฅผ ๋ฐ๋์ ๊ธฐ์ฌ
where: { id: 2 },
},
});
console.log(_comments);
res.json(_comments);
} catch (err) {
console.error(err);
next(err);
}
});
// ์๋ฒ ์คํ
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
Executing (default):
SELECT `comments`.`id`, `comments`.`commenter`, `comments`.`comment`, `comments`.`created_at`,
`commenter_user`.`id` AS `commenter_user.id`, `commenter_user`.`name` AS `comme` AS `commenter_user.age`,
`commenter_user`.`married` AS `commenter_user.married`, `commenter_user`.`comment` AS `commenter_user.comment`,
`commenter_user`.`created_at` AS `commenter_user.creatNNER JOIN `users` AS `commenter_user`
ON `comments`.`commenter` = `commenter_user`.`id` AND `commenter_user`.`id` = '1';
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.