백엔드 개발자(node.js)가 되는 과정

MySQL Sequelize에서 테이블에 필드(컬럼) 추가하기

soopy 2023. 6. 29. 01:20
728x90

웹사이트 프로젝트에서 서비스가 추가되다 보니 기존에 작성했던 ERD를 수정해야 하는 상황이 발생했다.
처음부터 ERD를 잘 짰으면 좋았겠지만 그러기는 쉽지 않은 것 같다.

어쨌든 이렇게 되면 특정 테이블 또는 테이블의 컬럼을 추가해야하는 상황이 발생한다.
이럴 때는 마이그레이션을 추가해주면 된다.

npx sequelizse db:migrate 명령을 수행하면 migrations 폴더 내 js 파일을 순차적으로 실행하므로 기존 파일들 뒤에 신규 마이그레이션 파일을 추가해줌으로서 컬럼 또는 테이블을 추가해주는 명령을 더해주면 되는 것이다.

먼저 아래 명령을 실행하면 새로운 마이그레이션 파일이 생성된다.
--name 이후의 이름은 자유롭게 지으면 되나 가급적 의미가 담겨있으면 좋을 것 같다.
아래 예시의 경우 유저 테이블에 필드를 몇 개 추가하겠다는 의미를 담고자 했다.

npx sequelize migration:generate --name add-fields-users        

그러면 마이그레이션 생성 시간-add-fields-users.js 파일이 생성될 것이다. 이 곳에 컬럼을 추가하는 명령을 넣어보자

'use strict';

/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.addColumn('Users', 'snsId', {
      type: Sequelize.STRING,
    });

    await queryInterface.addColumn('Users', 'provider', {
      type: Sequelize.STRING,
    });
  },

  async down(queryInterface, Sequelize) {
    await queryInterface.removeColumn('Users', 'provider');
    await queryInterface.removeColumn('Users', 'snsId');
  },
};

위와 같이 입력하면 Users라는 테이블에 snsId 라는 필드를 추가하고, 타입은 STRING으로 지정하겠다는 의미이다.
아래도 비슷한 형식의 provider라는 필드를 추가하라는 의미가 된다.

down의 경우 migration을 Undo하는 기능이므로 해당 마이그레이션 파일에서 실행한 명령의 반대되는 명령을 하면 된다.
그래서 removeColumn을 쓰고 있는 것을 확인할 수 있다.

위 케이스의 경우는 상관없지만 특정 명령의 경우 up에서 실행한 순서의 역순으로 down에서 실행되도록 구현하는 것이 안전하다.
A 필드가 B 필드를 참조하거나 기타 서로 연결이 되는 명령이 수행되었을 경우 그 역순으로 Undo해야 "무슨 필드가 무슨 필드를 참조하고 있어서 삭제할 수 없다." 와 같은 오류가 발생하지 않기 때문이다.

마지막으로 npm sequelize db:migrate를 해주면 마지막 마이그레이션 파일도 실행이 되면서 최종적으로 MySQL 데이터베이스에 필드가 추가된 것을 확인할 수 있을 것이다.

728x90
728x90