프로그래밍 언어/NODE JS

데이터베이스 세팅하기

· 코딩마이데이

이제 생성한 모델들을 시퀄라이즈에 등록합니다. models/index.js에는 시퀄라이즈가 자동으로 생성한 코드들이 들어 있을 것입니다. 그것을 다음과 같이 통째로 바꿉닏다.

models/index.js

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require("../config/config")[env];
const User = require("./user");
const Post = require("./post");
const Hashtag = require("./hashtag");

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

db.sequelize = sequelize;
db.User = User;
db.Post = Post;
db.Hashtag = Hashtag;

User.init(sequelize);
Post.init(sequelize);
Hashtag.init(sequelize);

User.associate(db);
Post.associate(db);
Hashtag.associate(db);

module.exports = db;

 

각각의 모델들을 시퀄라이즈 객체에 연결했습니다. 이번에는 각 모델 간의 관계를 associate 함수 안에 정의해보겠습니다.

models/user.js

const Sequlize = require("sequelize");

module.exports = class User extends Sequlize.Model {
  static init(sequelize) {
    return super.init(
      {
        email: {
          type: Sequlize.STRING(40),
          allowNull: true,
          unique: true,
        },
        nick: {
          type: Sequlize.STRING(15),
          allowNull: false,
        },
        password: {
          type: Sequlize.STRING(100),
          allowNull: true,
        },
        provider: {
          type: Sequlize.STRING(10),
          allowNull: false,
          defaultValue: "local",
        },
        snsId: {
          type: Sequlize.STRING(30),
          allowNull: true,
        },
      },
      {
        sequelize,
        timestamps: true,
        underscored: false,
        modelName: "User",
        tableName: "users",
        paranoid: true,
        charset: "utf-8",
        collate: "utf8_general_ci",
      }
    );
  }

  static associate(db) {
    db.User.hasMany(db.Post);
    db.User.belongsToMany(db.User, {
      foreignKey: "followingId",
      as: "Followers",
      through: "Follow",
    });
    db.User.belongsToMany(db.User, {
      foreignKey: "followerId",
      as: "Followings",
      through: "Follow",
    });
  }
};

 

User 모델과 Post 모델은 1(User): N(Post) 관계에 있으므로 hasMany로 연결되어 있습니다. user.getPosts, user.addPosts 같은 관계 메서드들이 생성됩니다.

as에 특정 이름을 지정했으니 user.getFollowers, user.getFollwings 같은 관계 메서드를 사용할 수 있습니다, include 시에도 as에 같은 값을 넣으면 관계 쿼리가 작동합니다.

Post 모델도 작성해봅시다.

const Sequelize = require("sequelize");

module.exports = class Post extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        content: {
          type: Sequelize.STRING(140),
          allowNull: false,
        },
        img: {
          type: Sequelize.STRING(200),
          allowNull: true,
        },
      },
      {
        sequelize,
        timestamps: true,
        underscored: false,
        modelName: "Post",
        tableName: "posts",
        paranoid: false,
        charset: "utf8mb4",
        collate: "utf8mb4_general_ci",
      }
    );
  }

  static associate(db) {
    db.Post.belongsTo(db.User);
    db.Post.belongsToMany(db.Hastag, { through: "PostHashtag" });
  }
};

 

User 모델과 Post 모델은 1(User) : N(Post) 관계이므로 belongsTo로 연결되어 있습니다. 시퀄라이즈는 Post 모델에 User 모델의 id를 가리키는 UserId 컬럼을 추가합니다.

 

models/hashtag.js

const Sequelize = require("sequelize");

module.exports = class Hashtag extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        title: {
          type: Sequelize.STRING(15),
          allowNull: false,
          unique: true,
        },
      },
      {
        sequelize,
        timestamps: true,
        underscored: false,
        modelName: "Hashtag",
        tableName: "hashtags",
        paranoid: false,
        charset: "utf8mb4",
        collate: "utf8mb4_general_ci",
      }
    );
  }

  static associate(db) {
    db.Hashtag.belongsToMany(db.Post, { through: "PostHashtag" });
  }
};

 

Hashtag 모델은 Post 모델과 N:M 관계이므로 관계를 설정했습니다.

 

자동으로 생성된 모델도 다음과 같이 접근할 수 있습니다. 다음 모델을 통해 쿼리 호출이나 관계 메서드 사용도 가능합니다.

db.sequelize.models.PostHastag

db.sequelize.models.Follow