본문 바로가기
Node.js

데이터베이스 - 시퀄라이즈 모델

by Programmer.Junny 2025. 1. 17.
 
const Sequelize = require('sequelize');

class User extends Sequelize.Model {
  static initiate(sequelize) {
    User.init({
      name: {
        type: Sequelize.STRING(20),
        allowNull: false,
        unique: true,
      },
      age: {
        type: Sequelize.INTEGER.UNSIGNED,
        allowNull: false,
      },
      married: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
      },
      comment: {
        type: Sequelize.TEXT,
        allowNull: true,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: false,
        defaultValue: Sequelize.NOW,
      },
    }, {
      sequelize,
      timestamps: false,
      underscored: false,
      modelName: 'User',
      tableName: 'users',
      paranoid: false,
      charset: 'utf8',
      collate: 'utf8_general_ci',
    });
  }

  static associate(db) {
    db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
  }
};

module.exports = User;

1. Sequelize 모델 정의

  • Sequelize.Model을 확장한 클래스로 Sequelize.Model을 상속받아 모델을 정의
  • 모델은 static init 메서드와 static associate 메서드로 구성
    • init 메서드: 테이블 컬럼 및 테이블 설정을 정의
    • associate 메서드: 다른 모델과의 관계를 설정

해당 내용은 위의 코드에서 static initiate 내의 모델.init()static associate(db) 에 해당한다.

2. 모델 작성

init 메서드

  • init 메서드는 두 가지 매개변수를 받는다.
  • 첫 번째 매개변수: 테이블 컬럼에 대한 설정
    • 각 컬럼은 Sequelize의 자료형을 사용하여 정의
    • 예: STRING(100), INTEGER, BOOLEAN, DATE, INTEGER.UNSIGNED 등.
name: {
        type: Sequelize.STRING(20),
        allowNull: false,
        unique: true,
      },
      age: {
        type: Sequelize.INTEGER.UNSIGNED,
        allowNull: false,
      },
      married: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
      },
      comment: {
        type: Sequelize.TEXT,
        allowNull: true,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: false,
        defaultValue: Sequelize.NOW,
      }

위의 코드에서 User.Init 내의 해당 부분이다.

  • 두 번째 매개변수: 테이블 자체에 대한 설정
    • sequelize: DB 연결 객체를 지정
    • timestamps: true로 설정 시 자동으로 createdAt과 updatedAt 컬럼을 추가. (예제에서는 false로 설정할 수 있음)
    • underscored: 컬럼명과 테이블명을 스네이크 케이스로 설정.
    • modelName: 모델의 이름을 지정
    • tableName: 실제 테이블 이름을 지정. 기본적으로는 모델 이름을 소문자 복수형으로 사용
    • paranoid: true로 설정 시 deletedAt 컬럼을 추가하여, 삭제된 데이터도 복구 가능.
    • charset과 collate: 데이터베이스의 문자셋과 정렬 설정. 한글을 포함하려면 utf8 또는 utf8mb4 설정이 필요함.
{
      sequelize,
      timestamps: false,
      underscored: false,
      modelName: 'User',
      tableName: 'users',
      paranoid: false,
      charset: 'utf8',
      collate: 'utf8_general_ci',
    }

위의 코드에서 User.init() 의 두 번째 부분이다.

3. 정의된 모델 실행하기

const Sequelize = require('sequelize');
const User = require('./user');
const Comment = require('./comment');

const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);

db.sequelize = sequelize;

db.User = User;
db.Comment = Comment;

User.initiate(sequelize);
Comment.initiate(sequelize);

User.associate(db);
Comment.associate(db);

module.exports = db;

위의 코드는 index.js 에 작성되었다.

모델에 정의된 user.js와 comment.js 를 require 해서 가져온 뒤, 

db.User = user;
db.Comment = Comment;

로 명시적 할당을 하여 속성을 구성한다.

User.initiate(sequelize);
Comment.initiate(sequelize);

이후 각 모델 파일에서 작성된 initiate(sequelize)를 호출하여 각 테이블 컬럼과 테이블 속성을 정의한다.

User.associate(db);
Comment.associate(db);

마지막으로 각 모델 파일에서 작성된 static associate(db) 를 호출하여 테이블간 관계를 설정한다.

4. Sequelize 자료형과 MySQL 자료형의 차이 비교

MySQL 자료형 Sequelize 자료형 옵션 / 설명
VARCHAR(100) STRING(100) 문자열, 길이 제한
TEXT TEXT 문자열, 길이 제한 없음
INT INTEGER 정수형
TINYINT BOOLEAN 불리언 값 (0 또는 1)
DATETIME DATE 날짜 (시간 포함)
DATE DATEONLY 날짜 (시간 X)
INT UNSIGNED INTEGER.UNSIGNED 부호없는 정수형
NOT NULL allowNull: false NULL 허용하지 않음 (필수 조건)
UNIQUE unique: true 유일한 값만 허용
DEFAULT NOW() defaultValue: Sequelize.NOW 기본값으로 현재 시간 설정

최근댓글

최근글

skin by © 2024 ttuttak