시퀄라이즈

수영·2023년 1월 21일
0

2023 겨울방학

목록 보기
3/7

시퀄라이즈란

시퀄라이즈는 단순하게 말하면 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 메서드로 표현한다.

UserListPost관계를 설정 할 때 다수을 가질 수 있는 Userdb.User.hasMany(db.ListPost);로 표현하고 1을 가질 수 있는 ListPostdb.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;

0개의 댓글