2022이전/node.js

Sequelize (세팅, 모델링)

바로퇴장 2020. 1. 15. 16:50

Sequelize는 nodejs에서 데이터베이스를 ORM으로 바꿔주는 모듈이다. 만약 데이터베이스를 mySQL이나 postgres를 사용한다면 유용하게 데이터베이스를 구축하고 raw쿼리를 사용하지 않고 쉽게 쿼리문을 작성할 수 있게 한다.

세팅

console창

npm i sequelize mysql2
npm i -g sequelize-cli
sequelize init

위에 같은 콘솔을 입력하면 config/config.json 파일이 생기고 각종 sequelize 관련된 폴더들이 생성될 겉이다.

config/config.json

{
  "development": {
    "username": "root",
    "password": PASSWORD,
    "database": DATABASE_NAME,
    "host": "127.0.0.1",
    "port": 3306,
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": PASSWORD,
    "database": DATABASE_NAME,
    "host": "127.0.0.1",
    "port": 3306,
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": PASSWORD,
    "database": DATABASE_NAME,
    "host": "127.0.0.1",
    "port": 3306,
    "dialect": "mysql"
  }
}

혹시 몰라서 config.json 대신에 config.js로 세팅을 해보았지만 여러군대에서 문제가 생기는 바람에(내장 모듈에서 json파일형식을 통해서 값을 받아오도록 지정해둠....) json형태로만 가능하다는 점이다. 알고보니 잘 js로 바꿀수 있다네요...

sequelize db:create

sequelize cli로 config.json기반으로 데이터베이스가 생성이 된다.

만약 db:drop을 실행하면 해당 데이터베이스가 drop된다.

데이터모델링

var fs = require('fs');
var path = require('path');
var basename  = path.basename(__filename);
const Sequelize = require('sequelize');
require('dotenv').config();
const env = process.env.NODE_ENV || 'development';
const db = {};

const sequelize = new Sequelize(
   process.env.DATABASE, process.env.DB_USERNAME, process.env.DB_PASSWORD, {
     host: process.env.DB_HOST,
     dialect: 'mysql',
   }
)

//이 부분은 생성된 테이블을 sequelize에서 모델을 넣어준다.(단 관계형 데이터모델은 따로 넣어줘야한다.) 
fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});


db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = require('./user.js')(sequelize, Sequelize);
db.Post = require('./post.js')(sequelize, Sequelize);
db.Comment = require('./comment.js')(sequelize, Sequelize);
db.Hashtag = require('./hashtag.js')(sequelize, Sequelize);

//작성자와 게시글
db.User.hasMany(db.Post, {foreignKey: 'PostId', as: 'posts'});
db.Post.belongsTo(db.User, {as : 'writer'});

//게시글과 댓글
db.Post.hasMany(db.Comment, {as: 'comments'});
db.Comment.belongsTo(db.Post, {as: 'post'});

//대댓글
db.Comment.hasMany(db.Comment, {as: 'sub_comment'});

//작성자와 좋아요글
db.User.belongsToMany(db.Post, { through: 'Like_Post'});
db.Post.belongsToMany(db.User, { through: 'Like_Post'});

//작성글과 해시태그
db.Post.belongsToMany(db.Hashtag, { through: 'PostHashTag'});
db.Hashtag.belongsToMany(db.Post, { through: 'PostHashTag'});

각각의 모델들을 User.js, Post.js, Comment.js 등 models폴더 안에서 정의를 해준 뒤 관계형 데이터모델을 만들어준다.

app.js

...
const { sequelize } = require('./models');
// // 실시간으로 sequelize table 생성 확인
sequelize.sync();
...

sequelize.sync()를 실행하면 models/index.js을 참고하여 테이블을 생성하지만 이미 존재하는 테이블은 수정되지 않는다. 그렇게 원하는 테이블로 바꾸기 위해서 해당 테이블을 삭제후 변경해주거나 직접 mysql문을 통해서 변경하자