시퀄라이즈
는 단순하게 말하면 js에서 DB조작을 쉽게 할 수 있게해주는 라이브러리로 ORM(Object-relational Mapping)
으로 분류된다.
여기서 ORM
은 js 객체와 데이터 베이스의 관계를 매핑해주는 도구이다.
시퀄라이즈는 MySQL
,MariaDB
,PostgreSQL
등의 데이터 베이스에서 사용할 수 있으며 문법이 어느정도 호완이 되서 다른 SQL 데이터 베이스로 바꿀 때에도 편리하다는 장점이 있다.
시퀄라이즈에서 모델은 필수적이며 테이블에 해당하는 추상적인 개념이다.
모델은 시퀄라이즈가 데이터베이스의 테이블 이름,테이블속 칼럼, 데이터 타입을 인식하게 해주는 존재이다.
이 모델은 이름을 갖는데 보통 모델은 User
와 같이 단수의 형태, 테이블은 users
와 같이 복수의 형태를 취해준다.
먼저 users
테이블을 생성해보자
models/user.js
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model{
static init(sequelize){
return super.init({
email:{
type: Sequelize.STRING(20),
allowNull: true,
unique: true,
},
nick_name: {
type: Sequelize.STRING(20),
allowNull: false,
},
snsId:{ //kakao에서 넘어오는 아이디
type: Sequelize.STRING(30),
allowNull: true,
},
password: { //내가 추가
type: Sequelize.STRING(100),
allowNull: false,
},
provider :{ //회원가입 방식 ex)'kakao'
type: Sequelize.STRING(10),
allowNull: true,
},
rank: {
type: Sequelize.STRING(20),
allowNull: true,
}
},{
sequelize,
timestamps: true, //작성일시와 업데이트 일시를 기록해줌
underscored: false,
modelName: 'User', //단수
tableName: 'users', //복수
paranoid: true, //삭제시 db상에서 날려버리는 것이 아니라 소프트 삭제를 해주는 옵션(삭제시 해당 칼럼에 해당 시간이 들어가는것으로 알고있다.)
charset: 'utf8',
collate: 'utf8_general_ci',
});
}
static associate(db) { //다른 테이블간의 관계를 선언한다.
db.User.hasMany(db.ListPost); //1:N
db.User.hasMany(db.ListPostComment);//1:N
db.User.hasMany(db.ApplicationAnswer);//1:N
db.User.hasOne(db.ClubUser);//1:1
db.User.hasMany(db.PatchNoteComment);//1:N
db.User.hasMany(db.RootComment);//1:N
db.User.hasMany(db.CardPostComment);//1:N
db.User.hasMany(db.ProjectComment);//1:N
}
}
users 테이블은 위에서 내가 선언한 6개의 칼럼과 옵션으로 선택으로 자동으로 생성해주는 3개의 칼럼 그리고 내가 PK값을 지정해주지 않았기 때문에 자동으로 Id값을 생성해주기 때문에 총 10개의 칼럼을 가지게 된다.
1:N 관계
를 선언할때는 hasMany
메서드로 표현한다.
User
와 ListPost
관계를 설정 할 때 다수을 가질 수 있는 User
는 db.User.hasMany(db.ListPost);
로 표현하고 1을 가질 수 있는 ListPost
는 db.ListPost.belongsTo(db.User);
로 표현한다.
1:1 관계
에서는 hasOne
메서드를 사용하는데 여기서 누가 hasOne
, belongsTo
를 사용해야하는지 애메한데 이럴때는 FK가 붙은 모델을 belongsTo
로 표현하면 된다.
N:M 관계
는 belongsToMany
메서드로 표현한다. 이경우에는 어느 한 테이블이 어느 다른 테이블에 종속되는 관계가 아니다. 또한 두개의 모델 모두 belongsToMany
메서드를 사용해 표현하면 된다.
위 user.js
와 같은 모델에서 관계선언을 하기 전에 index.js
에서 다른 테이블에 관한 선언을 해주어야 자동완성으로 오타없이 수월하게 진행할 수 있다.
models/index.js
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const User = require('./user');
const UserProject = require('./userProject');
const Schedule = require('./schedule');
const RootPost = require('./rootPost');
const RootComment = require('./rootComment');
const Reservation = require('./reservation');
const ProjectapplicationQuestion = require('./projectapplicationQuestion');
const ProjectapplicationAnswer = require('./projectapplicationAnswer');
const Project = require('./project');
const ProjectComment =require('./projectComment');
const PatchNoteComment = require('./patchNoteComment');
const PatchNote = require('./patchNote');
const ListPostComment = require('./listPostComment');
const ListPost = require('./listPost');
const ClubUser = require('./clubUser');
const CardPostComment = require('./cardPostComment');
const CardPost = require('./cardPost');
const ApplicationQuestion = require('./applicationQuestion');
const ApplicationAnswer = require('./applicationAnswer');
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = User;
db.UserProject = UserProject;
db.Schedule = Schedule;
db.RootPost = RootPost;
db.RootComment = RootComment;
db.Reservation = Reservation;
db.ProjectapplicationQuestion = ProjectapplicationQuestion;
db.ProjectapplicationAnswer = ProjectapplicationAnswer;
db.Project = Project;
db.ProjectComment = ProjectComment;
db.PatchNoteComment = PatchNoteComment;
db.PatchNote = PatchNote;
db.ListPostComment = ListPostComment;
db.ListPost = ListPost;
db.ClubUser = ClubUser;
db.CardPostComment = CardPostComment;
db.CardPost = CardPost;
db.ApplicationQuestion = ApplicationQuestion;
db.ApplicationAnswer = ApplicationAnswer;
User.init(sequelize);
UserProject.init(sequelize);
Schedule.init(sequelize);
RootPost.init(sequelize);
RootComment.init(sequelize);
Reservation.init(sequelize);
ProjectapplicationQuestion.init(sequelize);
ProjectapplicationAnswer.init(sequelize);
Project.init(sequelize);
ProjectComment.init(sequelize);
PatchNoteComment.init(sequelize);
PatchNote.init(sequelize);
ListPostComment.init(sequelize);
ListPost.init(sequelize);
ClubUser.init(sequelize);
CardPostComment.init(sequelize);
CardPost.init(sequelize);
ApplicationQuestion.init(sequelize);
ApplicationAnswer.init(sequelize);
User.associate(db);
UserProject.associate(db);
Schedule.associate(db);
RootPost.associate(db);
RootComment.associate(db);
Reservation.associate(db);
ProjectapplicationQuestion.associate(db);
ProjectapplicationAnswer.associate(db);
Project.associate(db);
ProjectComment.associate(db);
PatchNote.associate(db);
PatchNoteComment.associate(db);
ListPost.associate(db);
ListPostComment.associate(db);
ClubUser.associate(db);
CardPostComment.associate(db);
CardPost.associate(db);
ApplicationQuestion.associate(db);
ApplicationAnswer.associate(db);
module.exports = db;