백앤드(Back-End)/Node.JS

[Node.js] Sequelize Migration 사용법

RyanSin 2021. 2. 13. 09:37
반응형

- 지난 시간

안녕하세요. 지난 시간에는 Seeders를 사용해서 테스트 데이터를 추가하고 삭제하는 법에 대해 알아봤습니다.

 

혹시 놓치고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다.

any-ting.tistory.com/53

 

[Node.js] Sequelize Seeders 사용법

- 개요 안녕하세요. 이번 시간에는 Sequelize에 Seeders라는 기술에 대해 알아보겠습니다. 우리는 어떤 기능 개발을 하다 보면 테스트 데이터가 필요할 때가 있습니다. 필요할 때마다 우리는 데이터

any-ting.tistory.com

 

- 개요

이번 시간에는 DB 모델(테이블)을 수정하는 법에 대해 알아보겠습니다.

 

시퀄 라이즈에서는 마이그레이션을 지원합니다. 만약 우리가 운영 중인 서비스에 DB 상태를 변경하게 된다면, 여러 부분을 신경 습니다.

(잘못하면... 운영 중인 서비스에 큰 타격을 입게 된다... 조심...)

 

하지만 시퀄 라이즈에서 지원하는 마이그레이션을 사용한다면, 우리가 수정하고 싶은 모델을 소스코드에 작성해 수정할 수 있습니다.

 

- 마이그레이션 파일 생성

 

sequelize migration:create --name add // add라는 이름으로 파일이 생성된다.

 

마이그레이션 파일은 필요할 때마다 새롭게 생성해서 진행하는 것을 추천드립니다.

 

add.js 파일 구조

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
  },

  down: async (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
  }
};

 

지난 시간에 우리는 Seeders를 사용해서 테스트 데이터를 만들었습니다. Seeders와 구조가 동일한 것을 알 수 있습니다. :)

 

  • up 속성
    • migration을 통해 수정할 모델 작성하는 소스코드 로직
  • down 속성
    • migration을 통해 되돌릴 때 수행되는 로직

 

- 모델 수정 및 되돌리기

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    /**
     * Add altering commands here.
     *
     * Example:
     * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
     */
    const transaction = await queryInterface.sequelize.transaction();
    try {
      await queryInterface.addColumn(
        'Users',
        'Number',
        {
          type: Sequelize.DataTypes.INTEGER,
        },
        { transaction }
      );

      await transaction.commit();
    } catch (err) {
      await transaction.rollback();
      throw err;
    }

  },

  down: async (queryInterface, Sequelize) => {
    /**
     * Add reverting commands here.
     *
     * Example:
     * await queryInterface.dropTable('users');
     */
   return queryInterface.sequelize.transaction( transaction => {
     return Promise.all([
       queryInterface.removeColumn('Users', 'Number', {transaction: transaction})
     ])
   })
  }
};

 

소스코드를 확인하면 up: 부분에 addColumn과 down: 부분에 removeColumn을 확일 할 수 있습니다.

 

addColumn은 새로운 컬럼을 추가하며, removeColumn은 해당 컬럼을 삭제합니다.

 

마이그레이션 실행

sequelize db:migrate --env development

 

실행 결과

 

 

마이그레이션 되돌리기

sequelize db:migrate:undo --env development

 

실행 결과

 

실행 결과 컬럼이 추가되고 삭제되는 걸 확인할 수 있습니다.