Node.js/NodeBird(ZeroCho)

Sequelize sync + nodemon 구현

느리지만 꾸준하게 2021. 11. 3. 03:10

모델 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 만들기>

https://www.inflearn.com/course/%EB%85%B8%EB%93%9C%EB%B2%84%EB%93%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%A6%AC%EB%89%B4%EC%96%BC/dashboard

 

[리뉴얼] 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