Sequelize Migration

2023. 7. 9. 20:42ORM/Sequelize

migration 은 Sequelize CLI 를 이용해 MySQL 에 테이블을 생성하기 위해 사용된다.

MySQL 에 실제 이식될 테이블에 대한 형태, 속성값을 정의해준다.

 

npx sequelize model:generate --name Posts --attributes title:string,content:string,password:string

 

테이블을 생성하면 Migration, Models 폴더에 각각 1개의 파일이 생성된걸 확인 할 수 있다.

—name 은 테이블 이름을 지정

—attributes 는 입력한 Column 과 속성을 지정해준다.

Sequelize 는 Migrations 에 설정된 정보를 바탕으로 MySQL 테이블을 생성한다.

 

npx sequelize db:migrate
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
  /**
   * @param {import("sequelize").QueryInterface} queryInterface - Sequelize Query Interface
   * @param {import("sequelize")} Sequelize - Sequelize
   * **/
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Posts', {
      postId: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      title: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      content: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      password: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn("now")
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn("now") // migration에서는 Sequelize.NOW가 먹지 않는다.
      }
    });
  },
  /**
   * @param {import("sequelize").QueryInterface} queryInterface - Sequelize Query Interface
   * @param {import("sequelize")} Sequelize - Sequelize
   * **/
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('Posts');
  }
};

migration 파일은 대표적으로 아래와 같은 설정을 사용합니다.

  1. allowNull: NULL 값을 허용하는지 설정합니다.
    • true일 경우 NULL을 허용하고, false일 경우 NOT NULL 타입이 됩니다.
  2. autoIncrement: AUTO_INCREMENT 로 설정합니다.
    • 데이터를 삽입할 때 해당 컬럼에 아무런 값을 입력하지 않더라도 1씩 증가하여 고유한 값을 유지합니다.
  3. primaryKey: 기본키로 설정합니다.
  4. type: 타입을 지정합니다.
    • STRING, INTEGER, DATE 등 다양한 타입을 지정할 수 있습니다.
  5. defaultValue: 아무런 값이 입력되지 않았을 때, 기본값을 설정합니다.
    • 대표적으로 createdAt, updatedAt에서 NOW를 설정해, 현재 시간을 자동 삽입합니다.
  6. unique: 고유한 값만 들어올 수 있도록 설정합니다.

 

변경이 필요하다면?

 

# 가장 최근에 실행한 db:migrate를 취소합니다
npx sequelize db:migrate:undo

# migrations 폴더에 존재하는 migration 파일을 기반으로 테이블을 생성합니다.
npx sequelize db:migrate

Migration 을 사용하는 이유

sequelize 에서는 sequelize.sync() 명령어를 실행하여 models 폴더에 생성된 model 파일을 이용해 테이블을 생성할 수도 있다. 그러면 왜 migration 파일을 만드는 것일까?

운영중인 환경에서 DB 를 사용할 때는 서버의 실행 없이 MySQL 에 대한 관리가 필요한 경우가 많이 존재하고, model 파일만으로 구체적인 DB 설정을 하기 힘들기 때문이다.

또한 모델의 데이터 형식, 컬럼 추가, 제거, 테이블 추가, 테이블 제거와 같은 운영 중인 서버에서 DB 변경 작업시 편리하게 도와준다.

만약 Model 만으로 table 을 설계한다면

  1. sequelize 의 model 의 설계가 변경될 경우 현재 서비스 중인 테이블이 삭제된 후 생성된다.

만약 새로운 관심사 컬럼을 어떤 테이블에 추가한다고 한다면 , sequelize.sync 명령어를 이용해 model 로 테이블을 생성할 경우, 테이블이 깔끔하게 삭제된 후 다시 생성되는 것을 확인 할 수 있다.

  1. MySQL 의 테이블이 Node.js Application 에 의존적으로 된다.

app.js 의 sequelize.sync() 명령어가 수행되어야만 MySQL 의 테이블이 구현된다. 따라서 현재 DB 의 상황을 인지하기 힘들고, MySQL 에 직접 등록한 부가적인 기능들을 이해하기 힘들어진다.

'ORM > Sequelize' 카테고리의 다른 글

Sequelize CRUD 쿼리  (0) 2023.07.09
Sequelize 관계 정의하기  (0) 2023.07.09
Sequelize Model  (0) 2023.07.09
Sequelize 라이브러리 구성  (0) 2023.07.09
Sequelize 란?  (0) 2023.07.09