Dandy Now!
  • [Node.js] 시퀄라이즈로 컬럼 또는 테이블 추가 방법
    2024년 06월 11일 09시 56분 26초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    1. 데이터 손실 없이 칼럼 추가 가능?

     시퀄라이즈(Sequelize)는 DB 작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리이다. 시퀄라이즈는 모델을 통해 DB 테이블과 칼럼을 자동으로 생성해 준다. 기존 테이블에 칼럼을 추가할 경우 해당 테이블의 데이터에 손실이 발생할 수 있다. 여기에서는 데이터 손실 없이 칼럼을 추가하는 방법을 알아본다.

     

    2. Node.js 프로젝트 생성

    2.1. 프로젝트 생성

    npm init

     

    2.2. express 설치

    노드 서버를 구동하기 위해 설치한다.

    npm install express --save

    😉 공식 문서 : https://expressjs.com/ko/starter/installing.html

     

    2.3. nodemon 설치

    프로젝트 코드 수정 시 자동으로 서버를 재시작하는 기능을 제공하기 때문에 편리하다.

    npm i -D nodemon@2

    package.json 파일을 아래의 코드와 같이 수정한다.

    {
      // (생략)
      "scripts": {
        "dev": "nodemon app"
      },
      // (생략)
    }

    서버를 nodemon으로 구동한다.

    npm run dev

     

    3. 시퀄라이즈 설치

    여기에서는 DBMS로 MySQL을 이용한다. 따라서 sequelize와 mysql2 라이브러리를 설치한다.

    npm i sequelize sequelize-cli mysql2

     

    4. 데이터 손실 없이 칼럼 추가

    4.1. 마이그레이션 작업

    "addcolumn"은 임의로 작명한 것으로서 자신이 알아보기 쉬운 이름으로 작명하면 된다. 명령을 실행하면 migrations폴더 안에 마이그레이션용 js파일이 생성된다.

    npx sequelize migration:create --name addcolumn

     

    4.2. 칼럼 추가

    마이그레이션으로 생성된 js 파일을 열어서 칼럼을 추가하는 코드를 아래와 같이 작성하면 된다.

    'use strict';
    
    /** @type {import('sequelize-cli').Migration} */
    module.exports = {
      async up(queryInterface, Sequelize) {
        // ---추가----------------------------------------------
        // table1이라는 테이블에 column2라는 새로운 컬럼을 추가한다.
        return queryInterface.addColumn("table1", "column2", {
          type: Sequelize.INTEGER,
          defaultValue: 0,
        });
        // -----------------------------------------------------
      },
    
      async down(queryInterface, Sequelize) {
        // ---추가-------------------------------------------------
        // 위에서 추가한 내용을 롤백할때 사용하는 코드이다.
        return queryInterface.removeColumn("table1", "column2"); 
        // --------------------------------------------------------
      }
    };

    위 코드 작성 후 아래의 명령을 실행하면 table1이라는 테이블에 column2라는 새로운 컬럼을 추가한다.

    npx sequelize db:migrate

    위의 결과를 취소할 때는 아래의 명령어를 실행하면 된다.

    npx sequelize db:migrate:undo

     

    4.3. 모델에 컬럼 정보 추가

    최종적으로 table1 테이블 모델(table1.js)에 column2라는 칼럼과 관련된 정보를 추가한다. 모델에 컬럼 정보를 추가해야 시퀄라이즈를 이용해 CRUD를 진행할 수 있다.

    module.exports = (sequelize, DataTypes) => {
        const User = sequelize.define('Table1', {
            // (생략)
            // ---추가------------------------
            column2:{
                type: DataTypes.INTEGER,
                defaultValue: 0,
            }
            // -------------------------------
        }, {
            modelName: 'Table1',
            tableName: 'table1',
            charset: 'utf8',
            collate: 'utf8_general_ci', // 한글 저장
            sequelize,
        });
    
        return Table1;
    };

     

    5. 새로운 테이블 추가

    테이블 추가 생성의 경우 migrations를 사용할 필요가 없다.

    models 폴더에 추가하려고 하는 테이블의 모델(js파일)을 추가하고 init-models.js에 반영한 후 프로젝트 실행하면 아래 코드와 같이 app.js에 작성되어 있는 db.sequelize.sync()를 통해-DB에 해당 테이블이 없을 경우-새로운 테이블이 자동 생성된다. 

    // (생략)
    db.sequelize.sync()
        .then(() => {
            console.log('db 연결 성공');
        })
        .catch(console.error);
        
    // (생략)

     

    모델 작성 시 id 칼럼은 기본값으로서 명시하지 않아도 생성되는데, 칼럼명을 다르게 할 경우 아래와 같이 명시할 수 있다.

    const Sequelize = require("sequelize");
    module.exports = function (sequelize, DataTypes) {
      return sequelize.define(
        "table1",
        {
          // ---기본키 컬럼명을 id가 아닌 table1_id로 설정한 경우---
          table1_id: {
            type: DataTypes.BIGINT,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
          },
          // -----------------------------------------------------
          
        },
        {
          sequelize,
          tableName: "table1",
          timestamps: true, // createAt, updateAt 컬럼을 sequelize가 자동으로 생성하는 옵션이다.
          // ---검색을 빠르게 하기 위한 인덱스 설정---
          indexes: [
            {
              name: "PRIMARY",
              unique: true,
              using: "BTREE",
              fields: [{ name: "table1_id" }],
            },
          ],
          // ----------------------------------------
        }
      );
    };

     


    2024-11-05 추가

    테이블을 추가할 때 DBMS에서 추가하고자 하는 테이블을 생성한 후-작업 중인 프로젝트의 기존 models 폴더와 파일들 삭제 후-sequelize-auto로-models 폴더와 파일들을-자동 생성하는 것이 효율적이다. 기존 DBMS로 부터 모델을 자동 생성하는 방법은 이 링크(https://postforty.tistory.com/477)를 참조하자!

    728x90
    반응형
    댓글