[Node.JS] Sequelize

Yubin.Heo·2020년 11월 21일
5

🎄 Node.JS 🎄

목록 보기
1/3
post-thumbnail

Sequelize는 Mysql을 포함하여 많은 데이터베이스를 위한 Promise 기반의 ORM입니다.
Java 에서 Spring 같은 ORM 입니다.

Sequelize의 장점은, 테이블 구조를 미리 정의해 두면,
없을 경우 알아서 만들어준다는 점이 제일 편리했던 것 같습니다.

🎐 설치

npm install --save sequelize
npm i -g sequelize-cli
npm install mysql

🎈 Sequelize 초기화

sequelize init
 → 해당 명령어가 작동하지 않을시 npx sequelize init 사용

위 명령어를 사용하고 나면, 디렉토리에 많은 파일들이 생성되어 있을겁니다.
그 중, config/config.json 파일에는 DB 정보를 입력하는 파일입니다.

{
  "development": {
    "username": "db유저네임",
    "password": "db비번",
    "database": "db이름",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "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"
  }
}

자신의 환경에 맞게 입력하시면 됩니다.

✨ Sequelize 테이블 정의하기

테이블의 구조를 정의하기 위해서, 앞으로 modele
models 디렉토리 안에 파일을 추가할 겁니다.

/* models/users.js */
module.exports = (sequelize, DataTypes) => {
    return sequelize.define('users', {
        idx: { // 유저 번호
            type: DataTypes.INTEGER(20),
            allowNull: false,
            unique: true,
            autoIncrement: true,
            primaryKey: true
        }, 
        studentID: { // 학번
            type: DataTypes.INTEGER(30),
            allowNull: false
        },
        password: { // 비밀번호 
            type: DataTypes.STRING(200),
            allowNull: false,
        },
        studentName: { // 학생 이름
            type: DataTypes.STRING(100),
            allowNull: false,
        },
        remainingTime: { // 시간
            type: DataTypes.INTEGER(100),
            allowNull: false,
            defaultValue: 1800
        },
        isParticipation: { // 참여 여부 (0 : 미참여  /  1 : 참여)
            type: DataTypes.INTEGER(50),
            allowNull: false,
            defaultValue: 0
        },
    }, {
        timestamps: false,
        freezeTableName: true, // 테이블 이름 고정
        tableName: 'users', // 테이블 이름은 users로 설정
    });
};

sequelize.define(객체(이름), 테이블 구조 정의, 테이블 설정)
  → 위 내용을 사용하면 테이블의 구조를 정의할 수 있습니다.

참고로 dataType 같은 경우는 아래와 같이 적으시면 됩니다.

또한, Options 같은 경우는 아래와 같이 적으시면 됩니다.

🎭 relation 정의하기

[1:1] 관계 정의

db.User.hasOne(db.Info, { foreginKey:"user_id", sourceKey:"id"});
db.Info.belongTo(db.User, { foreginKey:"user_id", tarketKey:"id"});
/* 위 두 코드는 순서에 상관없이 사용할 수 있음. */

[1:N] 관계 정의

User.hasMany(Comment, { foreginKey:"commenter", sourceKey: "id"}); 
Comment.belongTo(User, { foreginKey:"commenter", targetKey: "id"});

[N:M] 관계 정의

Post.belongToMany(HashTag, { through:"PostHashTag"});
HashTag.belongToMany(Post, { through:"PostHashTag"});

🎨 정의된 Models 설정하기

/* models/index.js */
'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    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('./users')(sequelize, Sequelize);

module.exports = db;
/* app.js */
const sequelize = require('./models').sequelize;
sequelize.sync();

🧵 조회/삭제/변경/추가 쿼리

const { users } = require('../models');

/* DB 전체 조회 (SELECT * FROM users) */
const getUsers = async() => {
  const users = await users.findAll();
}

/* DB 값 추가 (INSERT INTO VALUE)  */
const setNewUser = async() => {
  var newUser = {
    studentID : 30323,
    password : "test",
    studentName : "Yubin.Heo"
  }
  const users = await users.create(newUser);
}

/* DB 값 수정 (UPDATE SET WHERE) */
const updateUser = async() => {
  await users.update({studentName:"YubinHeo"},{where:{studentID:30323}});
}

const deleteUser = async() => {
  await users.destroy({studentID: {id:30323}}); 
  // 특정 데이터만 삭제 (학번이 30323인 데이터 삭제)

  await users.destroy(); // 데이터 전체 삭제
}

1개의 댓글

comment-user-thumbnail
2020년 11월 21일

Sequelize 어렵다고 생각했는데
막상 해보고 나니 정말 쉽네요
좋은 강좌 감사합니다 ^^

답글 달기