시퀄라이즈는 DB 작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리이다.
ORM이란? ORM(Object-Relational Mapping)에 약자이다.
즉, ORM은 자바스크립트 객체와 관계형 데이터베이스를 서로 연결해주는 도구이다.
raw query를 작성할 필요가 없다는 사실!!
재사용이나 메서들끼리 트랜잭션 처리가 편리하다. -> 재사용 및 유지 보수가 편리함!
DBMS에 대한 종속성이 줄어든다.
깡 쿼리문보다 퍼포먼스가 느리다... -> But. 일정한 퍼포먼스를 유지하거나, 잘못된 커리문을 난사하는 것보다 시퀄라이즈가 처리해주는 것이 훨씬 좋다.
서비스가 복잡해질수록 ORM의 한계가 있다.
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server
각각 제공이 되는 RDB에 해당하는 것을 install 해주면 된다. (필자는 postgres 사용)
시퀄라이즈와 postgres 연결
// loaders/sequelize.js
const { Sequelize } = require('sequelize');
const dbConfig = require('../config/dbConfig');
const sequelize = new Sequelize(
dbConfig.database,
dbConfig.username,
dbConfig.password,
{
host: dbConfig.host,
dialect: 'postgres',
logging: true
}
);
module.exports = sequelize;
dbconfig에 DB에 대한 정보들을 선언해두고 가져와서 사용!
DB 테이블 연결
// models/index.js
const { Sequelize } = require('sequelize');
const sequelize = require('../loaders/sequelize');
const db = {
Sequelize,
sequelize,
// table
//ex)
user,
post
};
module.exports = db;
만약 table이 더생기면 table을 입력해주면 된다. 추가로, 이 파일에서 외래키나 외래키에 대한 정보들을 입력하게 되어있다. -> hasMany, belongsToMany, belongsTo 같은 모듈을 사용합니다~~!
// loaders/connect.js
const db = require('../models');
const connectDB = async () => {
try {
await db.sequelize
.authenticate()
.then(async () => {
console.log('Connection Success!');
})
.catch((e) => {
console.log('error : ', e);
});
//db.sequelize.sync({ force: false }).then(() => console.log('Table created'));
} catch (err) {
console.error(err.message);
process.exit(1);
}
};
module.exports = connectDB;
이 파일 또한 DB를 연결해주기 위한 작업이다. 여기서 주석으로 처리된 sync는 DB 테이블을 바꾸거나 컬럼이 바꼈을 때 사용합니다! 우리가 수정할 필요 없이 시퀄라이즈가 해줍니다~~
기본적으로 시퀄라이즈는 DB 테이블 생성, 코드로 쿼리 날리기입니다!
시퀄라이즈는 define()이라는 메서드를 통해서 DB 생성을 처리합니다.
// models/user
const user = sequelize.define(
'user',
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
nickname: {
type: DataTypes.STRING,
allowNull: false,
},
...
},
{
sequelize,
modelName: 'user',
freezeTableName: true,
underscored: true,
charset: 'utf8',
collate: 'utf8_general_ci',
timestamps: true,
paranoid: true,
}
define()을 통해 user 테이블을 정의하는 부분입니다. 그 밑은 테이블의 필요조건이나, 컬럼을 설정하는 부분입니다!
시퀄라이즈의 DataType
DataTypes.STRING // 문자열
DataTypes.TEXT // 텍스트
DataTypes.BOOLEAN // 논리형
DataTypes.INTEGER // 정수형
DataTypes.FLOAT // 실수형
...etc
시퀄라이즈의 옵션
modelName: 'TABLE_NAME' // 테이블 이름 정의
freezeTableName: true // 테이블 이름과 모델이름 동일하게 사용
underscored: true // 테이블 이름 Camel -> Snack Casc 변경
charset: 'utf-8'
collate: 'utf_general_ci // 위 charset과 함께 한국어를 저장할 수 있도록 설정
titmestamps: true // createdAt, updatedAt 자동 추가.
paranodi: true // deletedAt 자동생성 밑 삭제 때 soft delete시 용이
이렇게 옵션이랑 DB 테이블 컬럼 설정을 해주면! 짜자잔~ 하고 DB가 생성됩니다! (이미 DB가 존재하면 그 DB의 테이블명, 외래키 모두 똑같이 설정해줘야 합니다!)
// models/index.js
/*
User-Post 일대다 관계 (유저는 여러 개의 여행 후기를 작성할 수 있다.)
*/
user.hasMany(post, {
sourceKey: 'id',
foreignKey: 'user_id',
as: 'posts'
});
post.belongsTo(user, {
onDelete: 'CASCADE',
targetKey: 'id',
foreignKey: 'user_id'
});
기본적으로 각각 테이블의 id를 primaryKey를 설정해줘야합니다.
hasMany: 1대N 관계에서 1의 역할을 하는 DB TABLE
belongsTo: 1대N 관계에서 N의 역할을 하는 DB TABLE
모두 양방향으로 설정해줘야합니다. 그래야 시퀄라이즈가 pk로 연결 된 것을 인식할 수 있습니다.
그럼 N대M은?!!!
/*
User-Post 다대다 관계 (각 유저는 여러 개의 여행 후기를 스크랩할 수 있다.)
*/
user.belongsToMany(post, {
through: scrap,
foreignKey: 'user_id',
});
post.belongsToMany(user, {
through: scrap,
foreignKey: 'post_id',
hooks: true
});
위와 같이 belongsToMany라는 메서드를 통해 설정해주면 된다. 추가로, 양방향으로 연결도 해줘야합니다. -> 사실 scrap이라는 테이블을 사용하기 위해선 위 belongsToMant만 설정하면 된다고 공식문서에 나와있는데, 양방향 연결도 해줘야 돌아갑니다!!!!
다음 주제는 시퀄라이즈의 사용 방법과 MVC 패턴을 적용한 node입니당~