시퀄라이즈 (1)

JeJune Lee·2022년 1월 18일
0

Sequelize

목록 보기
1/2
post-thumbnail

시퀄라이즈(Sequelzie)란?

시퀄라이즈는 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 테이블 생성, 코드로 쿼리 날리기입니다!

시퀄라이즈 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입니당~

profile
Being Server developer

0개의 댓글

관련 채용 정보