: 자바스크립트 구문을 알아서 SQL로 변환해주며, DB 작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리이다.
npm install sequelize sequelize-cli mysql2
sequelize
: 시퀄라이즈 패키지
sequelize-cli
: 시퀄라이즈 명령어 실행
npx sequelize init
프로젝트를 처음 시작하는 경우에 유용 (자동으로
sequelize
에 필요한 폴더 생성됨)
기존 방식은 모델 폴더 안에 파일이 여러 개 있다면, 데이터베이스 연결 코드를 모든 파일에 적어줘야 한다. -> 만약 데이터 베이스 명을 바꾸게 된다면, 모든 파일의 내용을 수정해야 한다!
▶︎ config.json 파일
-> mysql에서 정의한 테이블을 sequelize에서도 정의해주어야 한다. (mysql 테이블과 sequelize의 모델이 대응됨)
type
: 데이터 타입을 정의 (예 : 문자, 숫자 등)
Sequelize 자료형 MySQL 자료형 STRING(n) VARCHAR(n) TEXT TEXT TEXT('tiny') TINYTEXT INTEGER INTEGER DATE DATETIME
primaryKey
: 기본키 설정autoIncrement
: 숫자 자동 증가allowNull
: NOT NULL 허용 여부comment
: column에 대한 설명을 작성validate
: 데이터 유효성 검사를 하는 속성
: 프로미스(promise)를 반환한다. -> .then()
을 붙에서 결과값을 사용할 수 있다.
Sequelize | MySQL |
---|---|
findAll() | select |
findOne() | select |
create() | insert |
update() | update |
destroy() | delete |
▶︎ 작성 예시
// [Before]
// const Visitor = require("../model/Visitor");
// [After]
// models: models/index에서 export 한 db 객체
const models = require("../models/index");
const Visitor = models.Visitor;
// GET /
exports.main = (req, res) => {
res.render("index");
};
// GET /visitor
exports.get_visitors = (req, res) => {
// [Before]
/*
Visitor.getVisitors((result) => {
// 모델의 rows를 result라는 변수명으로 받음
res.render("visitor", { data: result });
});
*/
// [After]
// SELECT * FROM visitor
Visitor.findAll().then((result) => {
console.log("findAll > ", result); // [ {}, {}, .. ]
res.render("visitor", { data: result });
});
};
// POST /visitor
exports.post_visitor = (req, res) => {
const { name, comment } = req.body;
// [Before]
/*
Visitor.postVisitor(req.body, (result) => {
// result: rows.insertId => ex ) 3
res.send({ id: result, name, comment });
});
*/
// [After]
// INSERT INTO visitor (name, comment) VALUES ( ? , ? )
Visitor.create({
name: name,
comment: comment,
}).then((result) => {
console.log("create > ", result);
res.send(result); // { id: 10, name: '1', comment: '1' }
});
};
// GET /visitor => localhost:PORT/visitor?id=N
exports.get_visitor = (req, res) => {
console.log(req.query); // { id: '1' }
// [Before]
/*
Visitor.getVisitor(req.query.id, (result) => {
// result : rows[0] -> { id: 1, name: '홍길동', comment: '내가 왔다.' }
console.log("get_visitor Cvisitor.js > ", result);
res.send(result);
});
*/
// [After]
// SELECT * FROM visitor WHERE id = ? //-> limit 1, 하나를 가져오는 것
Visitor.findOne({
where: { id: req.body.id },
}).then((result) => {
console.log("findOne > ", result);
res.send(result);
});
};
// PATCH /visitor
exports.patch_visitor = (req, res) => {
console.log(req.body); // { id: 5, name: 'banana2', comment: 'hi' }
// [Before]
/*
Visitor.patchVisitor(req.body, (result) => {
console.log("patchVisitor Cvisitor.js > ", result);
res.send("수정 성공!");
});
*/
// [After]
// UPDATE visitor SET name = ?, comment = ? WHERE id = ?
Visitor.update(
{
name: req.body.name,
comment: req.body.comment,
},
{
where: {
id: req.body.id,
},
}
).then((result) => {
console.log("update > ", result); // [ 1 ]
res.send("수정 성공!");
});
};
// DELETE /visitor
exports.delete_visitor = (req, res) => {
console.log(req.body);
console.log(req.body.id);
// [Before]
/*
Visitor.deleteVisitor(req.body.id, (result) => {
console.log("deleteVisitor Cvisitor.js > ", result);
res.send("삭제 성공!");
});
*/
// [After]
// DELETE FROM visitor WHERE id = ?
Visitor.destroy({
where: { id: req.body.id },
}).then((result) => {
console.log("destroy > ", result); // 1
res.send("삭제 성공!");
});
};
: 테이블은 서로 관계를 맺을 수 있으며, 이를 통해 복잡한 데이터 구조를 단순화화하고 용이하게 관리할 수 있다.
(예: 1:1
, 1:N
, N:N
)
외래키 : 다른 테이블의 키를 참조하는 것이다.
1:1
관계: 1:1
관계는 하나의 레코드(튜플)가 다른 하나의 레코드와 관련되어 있는 관계를 의미한다. (-> 서로 한 가지 정보만을 공유한다.)
① hasOne()
: 한 모델이 다른 모델을 가리키는 관계를 설정하는데 사용한다.
Player.hasOne(Profile, {
foreignKey: "player_id",
sourceKey: "player_id", // 생략 가능
// 연쇄 삭제, 수정
onDelete: "CASCADE",
onUpdate: "CASCADE",
});
② belongsTo()
: 다른 모델이 한 모델을 가리키는 관계를 설정하는데 사용한다.
: 외래키가 붙은 모델은 belongsTo()
로 기준을 잡아주면 된다.
Profile.belongsTo(Player, {
foreignKey: "player_id",
targetKey: "player_id", // 생략 가능 (테이블(profile)에 같은 이름(player_id)으로 만드는 거면 생략이 가능하나, 다른 이름으로 만들고 싶은 경우 테이블(profile)에 미리 정의를 해두어야 함) -> 기본키 사용시 생략가능
}); // -> Profile table에 player_id 칼럼이 하나 더 생김
// belongsTo에서의 foreignKey는 자신에게 속해있는 컬럼이고, targetKey는 foreignKey가 참조하는 상대 모델의 컬럼이다.
두 테이블이 소통하는 키는
foreignKey
인"player_id"
이며,
Player의sourceKey
는 곧 Profile의targetKey
가 된다.
1:N
관계: 1:N
관계는 한 쪽 레코드가 다른 쪽 레코드 여러 개와 관련되어 있는 관계이다. (예 : 부서와 직원, 고객과 주문, 학교와 학생 등)
① hasMany()
: 한 개의 모델이 다른 모델과 관계를 가질 때 사용한다.
Team.hasMany(Player, { foreignKey: "team_id", sourceKey: "team_id" });
② belongsTo()
: 다른 모델이 한 모델을 가리키는 관계를 설정하는데 사용한다.
Player.belongsTo(Team, {
foreignKey: "team_id",
targetKey: "team_id",
}); // -> Player table에 team_id 칼럼이 하나 더 생김
N:N
관계: N:N
관계는 한 쪽 레코드가 다른 쪽 레코드 여러 개와 관련되고, 그 반대쪽 레코드도 다른 쪽 레코드 여러 개와 관련되어 있는 관계를 의미한다. (-> 중간 테이블을 사용하여 구현하며, through
속성에 그 이름을 적으면 된다.)
- belongsToMany()
Player.belongsToMany(Team, { through: midTable })
참고: 포스코x코딩온 강의 자료(1016_Sequelize.pdf, 10_16-1데이터베이스응용.pdf)
: 두 테이블을 서로 연결하는 데 사용되는 키이다.
외래키가 포함된 테이블을 하위(자식) 테이블이라고 하고, 외래키 값을 제공하는 테이블을 참조 또는 상위(부모) 테이블이라고 한다.
외래키 값은 NULL이거나 참조 테이블의 기본키 값과 동일해야 한다.
참조 테이블의 기본키, 고유키를 외래키로 지정할 수 있다.
참조 테이블의 기본키, 고유키가 여러 개의 컬럼으로 이루어져 있다면 참조 테이블이 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있다.
외래키로 지정할 두 테이블의 필드는 같은 데이터 타입이어야 한다.