Sequelize.js
란 Node.js 기반의 ORM(Object-Releation-Mapping)이다.
SQL Query문을 사용하지 않고 자바스크립트만을 이용하여 SQL을 사용할 수 있도록 도와주는 라이브러리이다.
공식문서에 따르면 PostgreSQL, MySQL, MariaDB, SQLite, MS-SQL을 지원한다. 공식문서
sequlize module 설치
$ npm install sequelize
사용할 SQL module 설치
# MySQL
$ npm install mysql2
# PostgreSQL
$ npm install pg pg-hstore
# Microsoft SQL
$ npm install tedious
sequelize-cli
전역 설치
$ npm install -g sequelize-cli
# sequelize initialize
$ sequelize init
sequelize init
명령어를 통해 초기화를 하게 되면 config
, migrations
, models
, seeders
폴더가 생성된다.
/config/config.json
{
"development": {
"username": "", // 데이터베이스 사용자 명
"password": "", // 데이터베이스 비밀번호
"database": "", // 데이터베이스 이름
"host": "127.0.0.1", // 데이터베이스 호스트
"dialect": "mysql", // 사용할 데이터베이스
"operatorsAliases": false
},
}
/models/index.js
const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];
const db = {};
const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
// DB Models...
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
모델 정의는 sequelize 내장 함수 define()
을 사용한다.
데이터 타입
/models/user.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define(
"User", // 테이블 명
// 스키마 정의
{
email: {
type: DataTypes.STRING(100), // 40자 이내
allowNull: false, // 필수
unique: true, // 중복 금지
},
nickname: {
type: DataTypes.STRING(100),
allowNull: false, // 필수
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
// id, createdAt, updatedAt => 필드 자동 생성
},
// 테이블 옵션
{
charset: 'utf8',
collate: "utf8_general_ci", // 한글 저장되도록
}
);
return User;
};
1:1 관계 =>
hasOne()
,belongsTo()
1:N 관계 =>hasMany()
,belongsTo()
N:M 관계 =>belongsToMany()
=> N:M 관계에 있어 교차 테이블을 생성해야 하며, 교차 테이블은{ through: '교차 테이블명' }
와 같이through
프로퍼티로 정의해줄 수 있다.
“한 User는 여러개의 Post를 가지고 있을 수 있다.” (1:N의 관계)
관계 정의를 위해 Post 모델 정의,
/modes/post.js
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define(
"Post",
{
content: {
type: DataTypes.TEXT, // 매우 긴 글
allowNull: false,
},
}
{
chartset: "utf8mb4", // mb4 => 이모티콘 허용하기 위해
collate: "utf8mb4_general_ci",
}
);
return Post;
}
/models/user.js
module.exports = (sequelize, DataTypes) => {
...
// 관계 정의
User.associate = db => {
db.User.hasMany(db.Post);
}
return User;
}
/modes/post.js
module.exports = (sequelize, DataTypes) => {
...
Post.associate = db => {
db.Post.belongsTo(db.User);
}
return Post;
}
관계 정의를 위해 Hashtag 모델 정의,
/models/hashtag.js
module.exports = (sequelize, DataTypes) => {
const Hashtag = sequelize.define(
"Hashtag",
{
name: {
type: DataTypes.STRING(20),
allowNull: false,
},
},
{
charset: "utf8mb4",
collate: "utf8mb4_general_ci",
}
);
Hashtag.associate = (db) => {
db.Hashtag.belongsToMany(db.Post, {
through: "PostHashtag",
});
};
return Hashtag;
};
/modes/post.js
module.exports = (sequelize, DataTypes) => {
...
Post.associate = db => {
db.Post.belongsTo(db.User);
db.Post.blongsToMany(db.Hashtag, {
through: "PostHashtag",
});
}
return Post;
};