인프런 커뮤니티 질문&답변

진호님의 프로필 이미지
진호

작성한 질문수

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

시퀄라이즈 모델 만들기

sequelize initiate() 쓰는 방식 최신인지, 공식문서 방법인지 궁금합니다

작성

·

343

·

수정됨

0

영상에서는 sequelize 공식문서에서 바뀌어서 따라갔다고 하는데 공식문서에서 initiate() 쓰는 것 검색하였을 때 안보이며 static이랑 같이 쓴 것도 아직은 못찾았습니다

 

공식문서 따라가보면 주로 define(), init()을 쓰는데 강의영상의 방식과는 차이점이 있습니다.

  • define()

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
  // Model attributes are defined here
  firstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  lastName: {
    type: DataTypes.STRING
    // allowNull defaults to true
  }
}, {
  // Other model options go here
});

// `sequelize.define` also returns the model
console.log(User === sequelize.models.User); // true
  • init()

// Invalid
class User extends Model {
  id; // this field will shadow sequelize's getter & setter. It should be removed.
  otherPublicField; // this field does not shadow anything. It is fine.
}

User.init({
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true
  }
}, { sequelize });

const user = new User({ id: 1 });
user.id; // undefined

 

강의에서 알려주는 방식으로 DB연결도 되고 조작도 잘되지만

이렇게 질문을 남긴 이유는

강의에서는 공식문서를 따라갔다고 하는데 공식문서에서는 찾기 어렵다는 점과

강의에 나오는 방식이 시기가 지난 방법이 아닐까 하는 생각에 질문 남기게 되었습니다

 

제가 찾아본게 잘못된걸수도 있기에 그런점 있다면 알려주세요

글읽어주셔서 고맙습니다:)

답변 2

0

네 맞습니다. initiate함수는 sequelize에서 제공하는 메소드가 아닙니다. initiate 라는 이름 대신 다른 이름을 사용해도 됩니다. 제로초님은 static 메소드를 활용함으로써, User의 인스턴스 없이 User.initiate() 이런 식으로 바로 사용하는 방식을 선택하신 것 같습니다. 나중에 메소드 호출할 때를 생각해보면 제로초님의 방식이 깔끔한 것 같네요!

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

질문이 잘 이해가 안 되는데요. 저도 init을 강의에서 쓰고 있습니다.(User.init)

그리고 class 문법은 자유자재로 활용해도 됩니다. User.init을 static initiate라는 함수 안에서 호출할 뿐입니다.

진호님의 프로필 이미지
진호
질문자

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) {}
};

module.exports = User;

아하 initiate는 sequelize에 있는 키워드가 아니라 "class 문법은 자유자재로 활용" 인가보군요

 

진호님의 프로필 이미지
진호

작성한 질문수

질문하기