무지개곰
article thumbnail

Node.js에서 Sequelize는 ORM(Object-Relational Mapping) 라이브러리로서, 데이터베이스 쿼리를 추상화하여 개발자가 더 쉽게 데이터베이스를 다룰 수 있도록 합니다. Sequelize는 MySQL, PostgreSQL, MariaDB, SQLite, MSSQL 등 다양한 데이터베이스를 지원하며, 이번에는 Node.js에서 MySQL을 사용하는 Sequelize의 기본 설정과 사용 방법에 대해 알아보겠습니다.

Sequelize 설치

Sequelize를 사용하기 위해서는 Node.js 환경에서 sequelize 패키지를 설치해야 합니다. 터미널에서 다음 명령어를 입력하여 sequelize를 설치합니다.

npm install sequelize

MySQL을 사용하는 경우, 다음 패키지도 함께 설치해 줍니다.

npm install mysql2

앞으로 사용할 Sequelize의 기본 설정을 손쉽게 하기 위해서 sequelize-cli를 설치해 줍니다.

npm install -D sequelize-cli

Sequelize init

Sequelize를 사용하기 위해서 sequelize-cli를 통하여 기본 설정을 해줍니다.

npx sequelize init

Sequelize를 사용하기 위해서는 Sequelize 객체를 생성하고, 데이터베이스와 연결해야 합니다. Sequelize 객체는 sequelize 패키지의 Sequelize 클래스를 통해 생성할 수 있습니다.

 

models/index.js

"use strict";

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];

const db = {  };

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

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

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

module.exports = db;
 

위 코드에서 database, username, password는 config.json에 설정해 두며 MySQL 데이터베이스의 정보를 입력하고, host는 MySQL 데이터베이스가 실행 중인 호스트 주소를 입력합니다. 

 

config/config.json

{
  "development": {
    "username": "root",
    "password": "1234",
    "database": "test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "port": "3307"
  },
  "test": {
    "username": "root",
    "password": "1234",
    "database": "test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "port": "3307"
  },
  "production": {
    "username": "root",
    "password": "1234",
    "database": "test",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "port": "3307"
  }
}

dialect는 Sequelize에서 사용하는 데이터베이스 종류를 입력합니다. port는 MySQL을 사용하는 port로 설정을 해주시면 됩니다. 기본값은 3306 포트를 사용합니다.


Sequelize 모델 정의

Sequelize 모델은 MySQL 테이블과 매핑되는 JavaScript 객체입니다. Sequelize 모델을 정의하는 방법은 아래와 같습니다.

 

models/board.js

const Sequelize = require("sequelize");

module.exports = class Board extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        title: {
          type: Sequelize.STRING(255),
          allowNull:false,
          unique:true,
        },
        content: {
          type: Sequelize.TEXT,
          allowNull:false,
        },
        uploader: {
          type: Sequelize.STRING(255),
        },
        uptime: {
          type: Sequelize.STRING(255),
        },
      },
      {
        sequelize,
        modelName: "Board",
        tableName: "board",
        timestamps: true,
        charset: "utf8mb4",
        collate: "utf8mb4_general_ci",
      }
    );
  }
  static associate(db) {}
};

위 예제에서는 Sequelize 패키지를 가져온 후, class를 생성합니다. 생성한 class는 위에서 만든 index.js에 적용을 할 것이기에 module.exports를 해주었습니다. super.init의 첫 번째 매개변수의 내용은 테이블이 어떠한 칼럼을 가지는지 설정하고 칼럼별 옵션을 설정합니다.

 

두 번째 매개변수는 테이블의 옵션을 설정합니다.

sequelize : static init 메서드의 매개변수와 연결되는 옵션으로 db.sequelize 객체를 넣어야 합니다.

timestamps : true 혹은 false 값을 가질 수 있습니다. true의 경우 createdAt과 updatedAt 칼럼이 추가됩니다.

modelName : 모델 이름을 설정하며 모델 이름은 node에서 사용될 이름입니다.

tableName : 테이블의 이름을 설정합니다. DB에 사용되는 이름입니다.

paranoid : true로 설정하면 deletedAt이라는 칼럼이 생깁니다. DB에서 정보를 삭제할 때 완전히 지워지지 않고 deletedAt에 지운 시간이 기록됩니다.

charset, collate : 각각 utf8과 utf8_general_ci로 설정하여야 한글이 입력됩니다.


Sequelize 모델 연결

위처럼 테이블을 만든 이후 index.js에 테이블을 연결하여야 합니다.

const Board = require("./board.js"); 를 통하여 설정한 테이블 정보를 가져옵니다.

const db = { Board };를 통하여 db에 정보를 담아줍니다.

Board.init(sequelize);를 통하여 설정해 둔 static.init 메서드를 호출합니다.

 

"use strict";

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];

const Board = require("./board.js");

const db = { Board };

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

Board.init(sequelize);

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

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

module.exports = db;

 

profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!