Sequelize의 Migrations 소개

휴먼스케이프

안녕하세요. 저는 휴먼스케이프 인턴 Jason입니다.

Sequelize 튜토리얼 및 가이드 사이트에서 다루고 있는 Migrations의 소개와 함께 내용을 간단하게 요약하여 정리하고자 합니다.

Sequelize Migrations 소개

Sequelize는 Postgres, MySQL, MariaDB, SQLite 및 Microsoft SQL Server를 위한 Promise 기반의 Node.js ORM(Object-Relational Mapping)입니다.

Migrations은 Sequelize가 지원하는 기능 중 하나로, Git의 소스코드 변경사항 관리 기능처럼 데이터베이스의 변경 사항을 추적할 수 있습니다. Migration file에 상태를 저장하여 전환하거나, 이전 상태로 변경사항을 되돌릴 수도 있습니다.

Migration skeleton

Migration의 기본적인 사용법은 출처에 설치부터 실행까지 자세히 안내되어 있기 때문에 이 문서에서는 다루지 않도록 하겠습니다. 그럼 먼저 Migration의 스켈레톤을 소개 드리도록 하겠습니다.

아래는 일반적인 Migration 스켈레톤입니다.

module.exports = {
   up: (queryInterface, Sequelize) => {
     // logic for transforming into the new state
   },
 
   down: (queryInterface, Sequelize) => {
     // logic for reverting the changes
   } 
}

up은 새로운 상태로 변환하기 위한 로직을 의미하고, down은 변경 사항을 되돌리는 로직을 의미합니다. 두 함수들은 반드시 Promise를 리턴해야 합니다. 전달된 queryInterface 객체는 데이터베이스를 수정하기 위해 사용할 수 있습니다. Sequelize 객체는 STRING이나 INTEGER 같은 사용 가능한 데이터 타입을 저장합니다.

아래는 간단한 예시입니다.

module.exports = {
   up: (queryInterface, Sequelize) => {
     return queryInterface.createTable('Person', {
         name: Sequelize.STRING,
         isBetaMember: {
           type: Sequelize.BOOLEAN,
           defaultValue: false,
           allowNull: false
         }
       });
   },
   down: (queryInterface, Sequelize) => {
     return queryInterface.dropTable('Person');
   } 
}

queryInterface.createTable은 새로운 테이블을 생성하는 함수입니다. 예제의 up에서는 STRING 타입의 ‘name’과 BOOLEAN 타입의 ‘isBetaMember’ 두 속성을 가진’ Person’이라는 이름의 테이블을 생성하는 것을 볼 수 있습니다. down에서는 변경사항을 되돌릴 때 dropTable 함수를 사용하여 ‘Person’이라는 이름을 가진 테이블을 제거합니다.

메뉴얼에서는 위의 예제들과 함께 특정한 상황에서 사용되는 3개의 예제를 추가적으로 설명하고 있습니다.

Seed

Seed는 정적 데이터를 데이터베이스에 추가하는 기능을 의미합니다. 출처에서는 데이터베이스에 샘플 데이터 또는 테스트 데이터를 채우는데 사용할 수 있다고 설명하고 있습니다. 간단하게 생각하면, Migration은 데이터베이스의 스키마를 다루는 것이고, Seed는 데이터베이스의 데이터를 다룬다고 볼 수 있을 것입니다.

아래는 간단한 예시입니다.

'use strict';
  
module.exports = {
   up: (queryInterface, Sequelize) => {
     return queryInterface.bulkInsert('Users', [{
         firstName: 'John',
         lastName: 'Doe',
         email: 'demo@demo.com',
         createdAt: new Date(),
         updatedAt: new Date()
       }], {});
   },
   down: (queryInterface, Sequelize) => {
     return queryInterface.bulkDelete('Users', null, {});
   }
};

위의 Migration과 마찬가지로 up과 down 함수를 정의하지만, 안의 내용이 다른 것을 확인할 수 있습니다. 테이블(Table)을 다뤘던 Migration과는 달리, Seed는 행(Row)을 다루는 것을 확인할 수 있습니다.

up에서는 Seed가 실행될 때 ‘Users’ 테이블에 행 하나를 삽입하고, down에서는 Seed가 취소(Undo)될 때 제거합니다.

유의

Seed를 수행할 때에는 유의할 점이 있습니다. Seed는 Migration과 달리 데이터를 수정하는 것이기 때문에 스키마의 영향을 받습니다. 그러므로, Seed와 Migration을 수행할 필요가 있다면 실행하는 순서를 신중히 해야 합니다.

또한, Seed는 SequelizeMate 테이블을 사용하여 수행 정보를 저장하는 Migration과 달리 변경 사항을 어디에도 저장하지 않습니다. 때문에 Seed의 취소를 위해서는 수행 정보를 저장하는 스토리지가 필요하며, 스토리지에 대한 설정은 메뉴얼의 ‘Seed Storage’에서 보실 수 있습니다.

참고

이 밖에도 문서에 소개되지 않은 다양한 내용들이 출처에 존재합니다. 그러나 언급되지 않은 부분들은 어디까지나 Migration의 직접적인 구현이나 응용이 아닌 환경이나 구성의 설정을 다루기 때문에 이 문서에 정리하지 않았습니다.

좀 더 자세한 내용이 궁금하신 분들은 문서에 언급된 출처를 참고해주시기 바랍니다.

부족한 글 끝까지 읽어주셔서 감사합니다.

Get to know us better! Join our official channels below.

Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io

기업문화 엿볼 때, 더팀스

로그인

/