Node.js 서버 구조3: 데이터베이스(시퀄라이즈)

리린·2021년 6월 28일
0

node.js

목록 보기
8/16

시퀄라이즈 구조

Model/

app.js

  • app.js에 추가
...
const { sequelize } = require('./models');
...
sequelize.sync({ force: false })
  .then(() => {
    console.log('데이터베이스 연결 성공');
  })
  .catch((err) => {
    console.error(err);
  });
...

코드

Model/index.js

  • 코드구조
  1. 각종 모듈(sequelize, env, config)가져오기
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
  1. 데이터베이스 모델(user, post, hashtag 등) 도 가져오기
const User = require('./user');
const Post = require('./post');
const Hashtag = require('./hashtag');
  1. 빈 db를 정의
const db = {};
  1. 시퀄라이즈 생성자 인자에 config파일을 이용하여 데이터베이스, 유저 이름, 비밀번호를 입력
const sequelize = new Sequelize(
  config.database, config.username, config.password, config,
);
  1. 빈 db에 모델 연결하기 (js는 프로토타입 베이스)
db.sequelize = sequelize;
db.User = User;
db.Post = Post;
db.Hashtag = Hashtag;
  1. 테이블에 대한 설정: 각 모델의 static.init 메서드 호출
  • init이 실행되어야 테이블이 모델로 연결됨
User.init(sequelize);
Post.init(sequelize);
Hashtag.init(sequelize);
  1. 다른 모델과의 관계 설정: associate 메서드로 연결
User.associate(db);
Post.associate(db);
Hashtag.associate(db);
  1. 모듈 내보내기
module.exports = db;

Model /user.js

  • 코드구조
  1. sequelize 모듈 가져오기
const Sequelize = require('sequelize')
  1. 모듈 내보내기
  • Sequelize.Model에서 확장된 클래스의 static.init(sequelize)에서 super.init 반환하여 모델 정의하기
  • 이때 super.init의 첫 번째 인자는 각 칼럼의 정의
  • super.init의 두 번째 인자는 테이블 자체에 대한 정의
module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      email: {
        type: Sequelize.STRING(40),
        allowNull: true,
        unique: true,
      },
      nick: {
        type: Sequelize.STRING(15),
        allowNull: false,
      },
      password: {
        type: Sequelize.STRING(100),
        allowNull: true,
      },
      provider: {
        type: Sequelize.STRING(10),
        allowNull: false,
        defaultValue: 'local',
      },
      snsId: {
        type: Sequelize.STRING(30),
        allowNull: true,
      },
    }, {
      sequelize,
      timestamps: true,
      underscored: false,
      modelName: 'User',
      tableName: 'users',
      paranoid: true,
      charset: 'utf8',
      collate: 'utf8_general_ci',
    });
  }
  1. 다른 테이블과 관계 설정하기(여전히 class 테이블 안)
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',
    });
  }
};
  • .hasMany(db.모델):
    인자로 주어진 모델과 1:N관계를 갖는다.
    -- user.getPosts, user.addPosts 과 같은 관계 메서드들이 생성됨
db.User.hasMany(db.Post);
  • .belongsTo(db.모델):
    인자로 주어진 모델에게 속해있다.
    --post.getUser, post.addUser 등의 관계 메서드가 생성된다.
post.getHashtags, post.addHashtags, 
  • .belongsToMany(db.모델, 외래키 오브젝트) :
    모델과의 n:m관계를 나타낸다
    --PostHashtag라는 중간 모델이 생긴다.
    --각각 postId와 hashtagId라는 외래키도 추가된다.
    --(as를 따로 지정하지 않았다면) post.getHashtags, post.addHashtags, hashtags.getPost 등의 관계 메서드들이 생성된다.
(케이스1)
db.Post.belongsToMany(db.Hashtag, {through:'PostHashtag'});
  • 같은 테이블 안에서 n:m 관계일 경우:
    -- through: 모델 이름을 따로 생성한다.
    -- foreignKey옵션에 대상을, as 에 반대되는 모델을 입력한다
    --user.getFollowers, user.getFollowings 등의 관계 메서드를 사용할 수 있다.
db.User.belongsToMany(db.User, {
      foreignKey: 'followingId',
      as: 'Followers',
      through: 'Follow',
    });
db.User.belongsToMany(db.User, {
      foreignKey: 'followerId',
      as: 'Followings',
      through: 'Follow',
    });
  • 자동으로 생성된 모델(n:m등에서)도 다음과 같이 접근 가능하다
db.sequelize.models.PostHashtag
db.sequelize.models.Follow 

config / config.json

  • 코드구조
  1. config.json를 읽어 데이터베이스를 생성한다.
    (비밀번호읽기 + 데이터베이스 이름 설정하기 + operatorAliases 속성 삭제하기)
{
  "development": {
    "username": "root",
    "password": "nodejsbook",
    "database": "nodebird",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorAliases": false
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}
  1. 콘솔에 ' npx sequelize db:create ' 입력하여 데이터베이스 생성하기

app.js

  1. 라우터 불러들이는 쪽에 모듈 추가하기
dotenv.config();
const pageRouter = require('./routes/page');
const { sequelize } = require('./models');
  1. 모델을 서버와 연결하기
  • force: true 는 서버 실행 시마다 테이블을 재생성한다.
sequelize.sync({ force: false })
  .then(() => {
    console.log('데이터베이스 연결 성공');
  })
  .catch((err) => {
    console.error(err);
  });
profile
개발자지망생

0개의 댓글