본 포스팅은 sequelize-cli를 사용하였습니다. 디렉토리 구조는 아래와 같습니다.

├─config
│    └─config.json
├─migrations
│      (...)
├─models
│    └─index.js
└─seeders
       (...)

이 글을 쓰는 목적은 sequelize가 v4로 업데이트 되면서 바뀐 사항들이 꽤나 있습니다만, 포스팅이나 튜토리얼을 보면 예전방식으로 쓰여진 곳이 많더라구요. 대부분 deprecated메시지를 띄울뿐 에러는 띄우지 않는데 models폴더에서 테이블 정의할때 기본키(PK), 외래키(FK) 지정에 있어서는 오류가 뜨더라구요.

아래의 코드들은 sequelize 공식문서에서 가져왔습니다.

예전 방식

const Model = sequelize.define('Model', {
    ...
}, {
    classMethods: {
        associate: function (model) {...}
    },
    instanceMethods: {
        someMethod: function () { ...}
    }
});

새로운 방식

const Model = sequelize.define('Model', {
    ...
});

// Class Method
Model.associate = function (models) {
    ...associate the models
};

// Instance Method
Model.prototype.someMethod = function () {..}

보시면 아시겠지만 define메소드안의 옵션으로 안들어가고 Model의 메소드로 정의됩니다. 객체에 객체를 쓰는 것보다 훨씬더 보기 편해졌군요.

그리고 굳이 정의할 테이블이름.js에 들어가서 관계를 작성하지 않아도 됩니다. 관계를 한 곳에서 모아서 보는게 훨씬 더 편할 수도 있습니다.

// models/user.js
module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', {
        userId: {
            type: DataTypes.STRING,
            primaryKey: true
            validate: {
                (...)
            }
        },
        password: {
            type: DataTypes.STRING,
            allowNull: false
        },
        (...)
    });

    return User;
};

// models/order.js
module.exports = (sequelize, DataTypes) => {
    const Order = sequelize.define('Order', {
        (...)
        userId: {
            type: DataTypes.STRING
        },
        (...)
    });

    return Order;
};

// models/index.js
(...)
const db = {};
db.User.hasMany(db.Order, { foreignKey: 'userId' });
db.Order.belongsTo(db.User, { foreignKey: 'userId' });

(...)

hasManybelongsTo가 무엇인지 모른다면 링크를 클릭하세요.

PK, FK관계가 위처럼 한개밖에 없다면 테이블파일마다 각각 정의해도 상관 없지만, 나중에 인덱싱이 많이 필요하다면 index.js에 관계를 모아두는 방법도 추천하고 싶습니다.

// migrations/order.js
module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Orders', {
            (...)
            userId: {
                type: Sequelize.STRING,
                references: {
                    model: 'Users',
                    key: 'userId'
                }
            },
            (...)
        });

테스트전 migrations에서도 PK는 그냥 primaryKey만 정의해줘도 되지만 FK는 references객체도 작성해야 하는 것 잊지마세요 :)