데이터베이스 작업을 쉽게 할 수 있도록 도와주는 ORM(Object-Relational Mapping) 라이브러리이다. Sequelize를 사용하면 자바스크립트 구문을 알아서 SQL로 변환 해준다.
$ npm i sequelize sequelize-cli mysql2
config.json 파일에 데이터베이스의 정보를 저장해주면, model 에서 데이터베이스 세팅을 할 때 정보를 일일이 써주지 않아도 된다.
{
"development" : {
"host" : "localhost",
"database" : "sesac",
"username" : "user",
"password" : "1234",
"dialect" : "mysql"
},
"production" : {
},
"test" :{
}
}
파일명은 꼭 index.js 일 필요는 없다.
// sequelize 모듈 불러오기
const Sequelize = require("sequelize");
// config.json파일의 "development"의 값을 config 변수에 저장해준다
const config = require("../config/config.json")["development"];
// db 객체 생성. 나중에 정보를 넣어줄 것이다.
const db = {};
const sequelize = new Sequelize(
// 원래 이 부분에 일일이 데이터베이스 정보를 적어줘야 하는데, config에 정보를 저장해주었기 때문에 이렇게 작성할 수 있다.
config.database,
config.username,
config.password,
config
);
// dictionary.key = value -> 이렇게 새로운 키와 값을 넣어준 것이다.
db.sequelize = sequelize;
db.Sequelize = Sequelize;
// 결국 const db = {"sequelize" : sequelize, "Sequelize" : Sequelize}; 이런 형태
// ./Visitor.js에서 module.exports에 있는 Visitor 함수를 불러오는데 바로 실행시켜서 return된 model이 db.Visitor에 담긴다.
db.Visitor = require("./Visitor")(sequelize, Sequelize);
// db를 내보내준다.
module.exports = db;
// Sequelize는 model/index.js에서의 sequelize
// DataTypes는 model/index.js에서의 Sequelize
const Visitor = (Sequelize, DataTypes) => {
// sequelize객체.define(테이블 이름, 컬럼 정의, 옵션 정의)
const model = Sequelize.define(
'visitor',
{
id : {
// int
type: DataTypes.INTEGER,
// not null
allowNull: false,
// primary key
primaryKey: true,
// auto_increment
autoIncrement: true
},
name: {
type: DataTypes.STRING(10),
allowNull: false
},
comment: {
type: DataTypes.TEXT('medium')
}
},
{
// true로 지정하게 되면 등록된 시간과 수정된 시간을 갖는 컬럼이 만들어진다
timestamps: false,
tableName: 'visitor',
// sequelize에서 자동으로 table이름 뒤에 s를 붙이는데 freezeTableName 속성을 true로 주면 테이블 이름을 바꾸지 않는다.
freezeTableName: true
}
);
return model;
}
// Visitor를 내보내는데 이는 곧 Visitor함수에서 return된 model.
module.exports = Visitor;
// models는 model/index.js에서 exports된 db
// db.Visitor에 Visitor.js에서 exports된 Visitor함수의 리턴 값인 모델이 들어가 있다.
// 그래서 models.Visitor 이렇게 사용하면 된다
const models = require("../model");
exports.get_visitors = (req,res) => {
// sequelize 문법. Select * FROM visitor;와 같다
models.Visitor.findAll()
// sequelize는 프로미스 방식을 사용할 수 있다.
.then((result) => {
// findAll을 했을 때는 mysql에서 select한 결과와 같이 배열안에 객체가 담긴 형태로 값이 리턴된다.
// 그 중 dataValues라는 딕셔너리에 데이터가 담기는데 result.column으로 값을 가져올 수 있다
console.log("result[0] : ", result[0]);
// 객체안의 dataValues에서 id를 자동으로 찾아주는 것
console.log("id : ", result[0].id);
res.render("index", {data: result});
});
}
그럼 다음과 같이 콘솔에 결과가 나오는 것을 볼 수 있다.

SELECT * FROM table
모델.findAll(조건)
.then((result) => {
console.log( result );
})
// result = [{}, {}]
// 결과가 하나만 있어도 배열에 담긴다
SELECT * FROM table WHERE id = req.body.id AND name = req.body.name LIMIT 1
모델.findOne({where: {id: req.body.id, name: req.body.name}})
.then((result) => {
console.log( result );
})
// result = {}
// 객체로 리턴된다.
INSERT INTO table ('name', 'comment') VALUES (req.body.id, req.body.comment)
let object = {
name : req.body.name,
comment : req.body.comment
}
모델.create(object)
.then((result) => {
console.log( result );
})
// result = {}
// findOne과 마찬가지로 객체로 데이터가 들어온다.
// mysql을 사용해서 insert를 하면 데이터가 리턴되지 않지만 sequelize를 사용하면 데이터가 리턴되어서 더 편하다.

UPDATE table SET name = req.body.name, comment = req.body.comment WHERE id = req.body.id
let newObj = {
name : req.body.name,
comment : req.body.comment
};
모델.update(newObj, {where: {id: req.body.id}})
.then((result) => {
console.log( result );
})
// result = [바뀐 데이터의 개수]
DELETE FROM table WHERE id = req.body.id
모델.destroy({where: {id: req.body.id}})
.then((result) => {
console.log( result );
})
// result = 바뀐 데이터의 개수