본문 바로가기

Javascript/NodeJS

[NodeJs][MySQL] Sequelize를 통해 설치 후 배포 환경에 따른 데이터베이스 설정

반응형

⌗ 콘솔

  • sequelize 커맨드를 사용하기 위해 sequelize-cli 를 전역으로 설치 및 초기화
$ npm i
$ npm i sequelize mysql2
$ npm i -g sequelize-cli
$ sequelize init

 


models/index.js

'use strict';

const path = require('path');
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
const db = {};

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

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
  • sequelize-cli가 자동으로 생성하는 코드는 에러가 발생해 다음과 같이 수정해야함 (기본설정)

 

 


⌗ MySQL 연결

app.js

...

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var commentsRouter = require('./routes/comments');
var sequelize = require('./models').sequelize;

var app = express();
// Sequelize connect
sequelize.sync();

...
  • sequelize.sync();
  • sync 메서드를 사용하면 서버 실행시 알아서 MySQL과 연동

 

config/cofing.json

{
  "development": { //배포 환경
    "username": "root",
    "password": null,
    "database": "nodejs",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false, //보안에 취약한 연산자를 사용할지 여부
    "logging" : false //시퀄라이즈가 수행하는 SQL문이 로그에 노출되는 여부
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  }
}
  • development.password 와  development.database를 현재 MySQL 커넥션과 일치
  • test와 product은 각각 테스트 용도와 배포 용도로 사용

 


⌗ 모델 정의

models/user.js

module.exports = (sequelize, DataTypes) => {
  return sequelize.define('user', {
    name: {
      type: DataTypes.STRING(20),
      allowNull: false,
      unique: true,
    },
    age: {
      type: DataTypes.INTEGER.UNSIGNED,
      allowNull: false,
    },
    married: {
      type: DataTypes.BOOLEAN,
      allowNull: false,
    },
    comment: {
      type: DataTypes.TEXT,
      allowNull: true,
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: sequelize.literal('now()'),
    },
  }, {
    timestamps: false,
  });
};

 

models/comment.js

module.exports = (sequelize, DataTypes) => {
  return sequelize.define('comment', {
    comment: {
      type: DataTypes.STRING(100),
      allowNull: false,
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: true,
      defaultValue: sequelize.literal('now()'),
    },
  }, {
    timestamps: false,
  });
};

 


⌗ 모델 연결

models/index.js

'use strict';

const path = require('path');
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
const db = {};

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

db.sequelize = sequelize;
db.Sequelize = Sequelize;

db.User = require('./user')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);

//db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
//db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id' });

module.exports = db;
  • db.User = require('./user')(sequelize, Sequelize);
  • db.Comment = require('./comment')(sequelize, Sequelize);

 


반응형

❥ CHATI Github