Sequelize는 Mysql을 포함하여 많은 데이터베이스를 위한 Promise 기반의 ORM입니다.
Java 에서 Spring 같은 ORM 입니다.
Sequelize의 장점은, 테이블 구조를 미리 정의해 두면,
없을 경우 알아서 만들어준다는 점이 제일 편리했던 것 같습니다.
npm install --save sequelize
npm i -g sequelize-cli
npm install mysql
sequelize init
→ 해당 명령어가 작동하지 않을시 npx sequelize init 사용
위 명령어를 사용하고 나면, 디렉토리에 많은 파일들이 생성되어 있을겁니다.
그 중, config/config.json 파일에는 DB 정보를 입력하는 파일입니다.
{
"development": {
"username": "db유저네임",
"password": "db비번",
"database": "db이름",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
자신의 환경에 맞게 입력하시면 됩니다.
테이블의 구조를 정의하기 위해서, 앞으로 modele
models 디렉토리 안에 파일을 추가할 겁니다.
/* models/users.js */
module.exports = (sequelize, DataTypes) => {
return sequelize.define('users', {
idx: { // 유저 번호
type: DataTypes.INTEGER(20),
allowNull: false,
unique: true,
autoIncrement: true,
primaryKey: true
},
studentID: { // 학번
type: DataTypes.INTEGER(30),
allowNull: false
},
password: { // 비밀번호
type: DataTypes.STRING(200),
allowNull: false,
},
studentName: { // 학생 이름
type: DataTypes.STRING(100),
allowNull: false,
},
remainingTime: { // 시간
type: DataTypes.INTEGER(100),
allowNull: false,
defaultValue: 1800
},
isParticipation: { // 참여 여부 (0 : 미참여 / 1 : 참여)
type: DataTypes.INTEGER(50),
allowNull: false,
defaultValue: 0
},
}, {
timestamps: false,
freezeTableName: true, // 테이블 이름 고정
tableName: 'users', // 테이블 이름은 users로 설정
});
};
sequelize.define(객체(이름), 테이블 구조 정의, 테이블 설정)
→ 위 내용을 사용하면 테이블의 구조를 정의할 수 있습니다.
참고로 dataType 같은 경우는 아래와 같이 적으시면 됩니다.
또한, Options 같은 경우는 아래와 같이 적으시면 됩니다.
db.User.hasOne(db.Info, { foreginKey:"user_id", sourceKey:"id"});
db.Info.belongTo(db.User, { foreginKey:"user_id", tarketKey:"id"});
/* 위 두 코드는 순서에 상관없이 사용할 수 있음. */
User.hasMany(Comment, { foreginKey:"commenter", sourceKey: "id"});
Comment.belongTo(User, { foreginKey:"commenter", targetKey: "id"});
Post.belongToMany(HashTag, { through:"PostHashTag"});
HashTag.belongToMany(Post, { through:"PostHashTag"});
/* models/index.js */
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
/* 이 부분에 정의할 수 있음. */
db.user = require('./users')(sequelize, Sequelize);
module.exports = db;
/* app.js */
const sequelize = require('./models').sequelize;
sequelize.sync();
const { users } = require('../models');
/* DB 전체 조회 (SELECT * FROM users) */
const getUsers = async() => {
const users = await users.findAll();
}
/* DB 값 추가 (INSERT INTO VALUE) */
const setNewUser = async() => {
var newUser = {
studentID : 30323,
password : "test",
studentName : "Yubin.Heo"
}
const users = await users.create(newUser);
}
/* DB 값 수정 (UPDATE SET WHERE) */
const updateUser = async() => {
await users.update({studentName:"YubinHeo"},{where:{studentID:30323}});
}
const deleteUser = async() => {
await users.destroy({studentID: {id:30323}});
// 특정 데이터만 삭제 (학번이 30323인 데이터 삭제)
await users.destroy(); // 데이터 전체 삭제
}
Sequelize 어렵다고 생각했는데
막상 해보고 나니 정말 쉽네요
좋은 강좌 감사합니다 ^^