Back-end/Node.js

[Node.js+MYSQL] 시퀄라이즈 (2) (Sequelize)

poppy 2021. 7. 18. 14:42
반응형

https://soohyun6879.tistory.com/162

 

[Node.js +MYSQL] 시퀄라이즈 (1) (Sequelize)

시퀄라이즈란? (Sequelize) 시퀄라이즈는 ORM 입니다. 즉, 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구입니다. 시퀄라이즈는 여러 가지 데이터베이스와 연결할 수 있습니다.

soohyun6879.tistory.com

 

이전 포스팅에 이어서 시퀄라이즈에 대해 살펴보겠습니다. 이번 포스팅에서는 모델을 정의하고 모델 사이의 관계를 정의해보겠습니다!

 

1. 모델 정의하기

시퀄라이즈를 통해 MYSQL과 연결하기 위해서 MYSQL에서 정의한 테이블을 시퀄라이즈에서도 정의해야 합니다. (MYSQL 의 테이블 = 시퀄라이즈의 모델) 모델은 models 폴더 안에 정의하겠습니다. 모델은 Sequelize.Model을 확장한 클래스로 정의합니다. 모델은 static init 메서드와 static associate 메소드로 나뉩니다. static init 에는 테이블에 대한 설정을 하고, static associate 에는 다른 모델과의 관계를 설정합니다. static init 의 첫번째 인수는 테이블 컬럼에 대한 설정이고, 두번째 인수는 테이블 자체에 대한 설정입니다. 시퀄라이즈는 알아서 id를 기본키로 연결하므로 id 컬럼은 적어주지 않아도 됩니다!

// models/users.js (= users 테이블)
const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.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, // static init의 매개변수와 연결되는 옵션
      timestamps: false, // 자동으로 날짜 컬럼을 추가하는 옵션
      underscored: false, // 스네이크 케이스로 바꾸는 옵션
      modelName: 'User', // 모델 이름
      tableName: 'users', // 실제 데이터베이스의 테이블 이름
      paranoid: false, // deletedAt 컬럼을 생성하는 옵션
      charset: 'utf8', // 한글 설정
      collate: 'utf8_general_ci', // 한글 설정
    });
  }

  static associate(db) {
    db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
  }
};
// models/comment.js (= comments 테이블)
const Sequelize = require('sequelize');

module.exports = class Comment extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      comment: {
        type: Sequelize.STRING(100),
        allowNull: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: true,
        defaultValue: Sequelize.NOW,
      },
    }, {
      sequelize, // static init의 매개변수와 연결되는 옵션
      timestamps: false, // 자동으로 날짜 컬럼을 추가하는 옵션
      modelName: 'Comment', // 모델 이름
      tableName: 'comments', // 실제 데이터베이스의 테이블 이름
      paranoid: false, // deletedAt 컬럼을 생성하는 옵션
      charset: 'utf8mb4', // 한글 설정
      collate: 'utf8mb4_general_ci', // 한글 설정
    });
  }

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

 

시퀄라이즈의 자료형과 MYSQL의 자료형은 다릅니다. 어떻게 다른지는 다음 표를 참고해주세요!

 

MYSQL 시퀄라이즈 (Sequelize)
VARCHAR(100) STRING(100)
INT INTEGER
TINYINT BOOLEAN
DATETIME DATE
INT UNSIGNED INTEGER.UNSIGNED
NOT NULL allowNull: false
UNIQUE unique: true
DEFAULT now() defaultValue: Sequelize.NOW

 

2. 관계 정의하기

모델 정의하기에서의 코드에서 static associate 부분이 관계를 정의하는 부분입니다. 이 코드에서는  I:N(일대다) 관계이므로 user에는 hasMany 로 관계를 정의하고 comment에는 belongsTo 로 관계를 정의합니다. 

 

관계마다 사용하는 메서드는 다음을 참고해주세요!

 

 

반응형