모델 5개를 다 만들어 보았고
이제 불러와주자. models폴더의 index.js에서 아래 코드를 추가해준다.
db.Comment = require('./comment')(sequelize, Sequelize)
// index.js
const Sequelize = require('sequelize');
// 기본값으로 development가 들어있다. 즉 env는 development
const env = process.env_NODE_ENV || 'development';
// 즉 여기서는 env가 development이다. 만든 config.json을 require했다.
const config = require('../config/config')[env];
const db = {};
const sequelize = new Sequelize(config.database, config.usename, config.password, config)
db.Comment = require('./comment')(sequelize, Sequelize)
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
다른 모델들도 다 등록을 해주자.
db.Comment = require("./comment")(sequelize, Sequelize);
db.Hashtag = require("./Hashtag")(sequelize, Sequelize);
db.Image = require("./Image")(sequelize, Sequelize);
db.Post = require("./Post")(sequelize, Sequelize);
db.User = require("./User")(sequelize, Sequelize);
associate 있는 부분은 무슨 코드일까?
// index.js
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
바로 user.js에 있는 아래 코드를 실행해주는 것이다.
User.associate = (db) => {
db.User.hasMany(db.Post);
db.User.hasMany(db.Comment);
db.User.belongsToMany(db.Post, { through: 'Like', as: 'Liked' });
db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followers', foreignKey: 'FollowingId' }); // foreignKey부터 시작해서 as의 Followers를 찾는다.
db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followings', foreignKey: 'FollowerId' }); // foreignKey부터 시작해서 as의 Followings를 찾는다.
};
지금 index.js에 있는 db의 빈배열에 모델 5개를 등록을 해주었다. 그것들이 반복문 돌면서 associate해서 관계들 연결을 해주는 과정을 나타낸다.
const Sequelize = require("sequelize");
// 기본값으로 development가 들어있다. 즉 env는 development
const env = process.env_NODE_ENV || "development";
// 즉 여기서는 env가 development이다. 만든 config.json을 require했다.
const config = require("../config/config")[env];
const db = {};
const sequelize = new Sequelize(
config.database,
config.usename,
config.password,
config
);
db.Comment = require("./comment")(sequelize, Sequelize);
db.Hashtag = require("./Hashtag")(sequelize, Sequelize);
db.Image = require("./Image")(sequelize, Sequelize);
db.Post = require("./Post")(sequelize, Sequelize);
db.User = require("./User")(sequelize, Sequelize);
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
이렇게 해서 sequelize에 모델들 다 등록을 하였다.
// comment db연결
Comment.associate = (db) => {
db.Comment.belongsTo(db.User);
db.Comment.belongsTo(db.Comment);
};
// hashtag db연결
Hashtag.associate = (db) => {
db.Hashtag.belongsToMany(db.Post);
};
// image db연결
Image.associate = (db) => {
// 게시글이 1 이미지가 N
db.Image.belongsTo(db.Post);
};
// post db연결
Post.associate = (db) => {
db.Post.belongsTo(db.User); // post의 작성자
db.Post.belongsToMany(db.Hashtag);
db.Post.hasMany(db.Comment);
db.Post.hasMany(db.Image);
db.Post.belongsToMany(db.User, { through: 'Like' }); // post의 좋아요를 누른 사람들
// 어떤 게시글의 리트윗 게시글을 구현하자.
// as Retweet으로 해서 PostId에서 Retweet으로 바뀐다.
db.Post.belongsTo(db.Post, { as: 'Retweet' });
};
// user db 연결
User.associate = (db) => {
db.User.hasMany(db.Post);
db.User.hasMany(db.Comment);
db.User.belongsToMany(db.Post, { through: 'Like', as: 'Liked' });
db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followers', foreignKey: 'FollowingId' }); // foreignKey부터 시작해서 as의 Followers를 찾는다.
db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followings', foreignKey: 'FollowerId' }); // foreignKey부터 시작해서 as의 Followings를 찾는다.
};
sequelize에 모델들을 다 등록을 하였으니까 express에서 모델들을 다 등록을 해주어야 한다.
초기에 작성해준 app.js를 서비스의 본체라고 여기고 코드를 작성하자.
// 초기 app.js
const express = require('express');
const postRouter = require('./routes/post')
const app = express();
app.get('/', (req, res) => {
res.send('hello express');
})
app.get('/', (req, res) => {
res.send('hello api');
});
app.get('/posts', (req, res) => {
res.json([
{ id: 1, content: 'hello'},
{ id: 2, content: 'hello2'},
{ id: 3, content: 'hello3'},
]);
})
app.use('/post', postRouter);
app.listen(3065, () => {
console.log('서버 실행 중');
});
이렇게 해서 서버 실행할 때 sequelize의 연결도 같이 된다.
const express = require("express");
const postRouter = require("./routes/post");
const db = require("./models");
const app = express();
db.sequelize
.sync()
.then(() => {
console.log("db 연결 성공");
})
.catch(console.error);
하지만.... node app을 실행을 하였더니 아래와 같은 에러가 뜬다.
만약에 에러를 고치면 서버 실행하기 전에 아래코드를 먼저 쳐준다. 실행을 시켜주면 아래와 같이 나타난다.
npx sequelize db:create
11/4 에러를 고쳤다..
이유는 hashtag부분에 db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' }); 부분과
post 부분에 db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });에서 각각 through를 안붙여줬기 때문이다.
다시 nodeapp을 실행시켜주고 nodeapp을 실행시켜 준 다음에 mysql_workbench를 열어서 확인해준다.
아래 명령어를 v2.0으로 해준 다음에
npm i -D nodemon@2
package.json파일에서 dev를 추가해주고 npm run dev를 실행시켜준다.
"scripts": {
"dev": "nodemon app"
},
<출처 조현영: [리뉴얼] React로 NodeBird SNS 만들기>
[리뉴얼] React로 NodeBird SNS 만들기 - 인프런 | 강의
리액트 & 넥스트 & 리덕스 & 리덕스사가 & 익스프레스 스택으로 트위터와 유사한 SNS 서비스를 만들어봅니다. 끝으로 검색엔진 최적화 후 AWS에 배포합니다., 새로 만나는 제로초의 리액트 노드버
www.inflearn.com
'Node.js > NodeBird(ZeroCho)' 카테고리의 다른 글
Sequelize 관계 설정하기 (0) | 2021.11.03 |
---|---|
Sequelize Model 만들기 (0) | 2021.11.02 |
MySQL과 Sequelize 연결하기 (0) | 2021.11.02 |
Express Router 분리하기 (0) | 2021.11.02 |
Express로 Routing하기 (0) | 2021.11.02 |