데이터베이스 세팅하기
이제 생성한 모델들을 시퀄라이즈에 등록합니다. 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
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| Passport 모듈로 로그인 구현하기 (0) | 2025.10.20 |
|---|---|
| 데이터베이스 세팅하기 (3) (0) | 2025.10.17 |
| 데이터베이스 세팅하기 (1) (0) | 2025.10.11 |
| 프로젝트 구조 갖추기 (2) (0) | 2025.10.08 |
| 프로젝트 구조 갖추기 (1) (0) | 2025.10.05 |