시퀄라이즈(1)

올챙이·2024년 9월 1일

Node.js

목록 보기
19/23
post-thumbnail

시퀄라이즈는 ORM(Object-relational Mapping)으로 분류됩니다. ORM은 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구입니다.

Node.js 교과서 개정3판 p.332

시퀄라이즈 사용하기

package.json

npm init을 통해 package.json을 생성해줍니다.

1
2
3
4
5
6
7
8
9
10
11
{
    "name": "learn-sequelize",
    "version": "0.0.1",
    "description": "시퀄라이즈를 배우자",
    "main": "app.js",
    "scripts": {
        "start": "nodemon app"
    },
    "author": "sojeong",
    "license": "MIT"
}
cs

패키지 설치

1
npm i -D nodemon
cs

1
npm i express morgan nunjucks sequelize sequelize-cli mysql2
cs
  • sequelize-cli

    • 시퀄라이즈 명령어를 실행하기 위한 패키지입니다.
  • MySQL2

    • MySQL과 시퀄라이즈를 이어주는 드라이버 입니다.
  • 설치 이후

    1
    npx sequelize init
    cs
    • Sequelize 프로젝트에 필요한 기본적인 설정 파일들과 폴더 구조를 생성해줍니다.

수정 파일 (models/index.js)

  • Sequelize를 사용하여 데이터베이스에 연결하고, 그 연결을 다른 파일에서도 사용할 수 있도록 설정하는 역할을 합니다.

  • 그대로 사용할 때 에러가 발생하고, 필요없는 부분도 있기 때문에 수정해주어야 합니다.

  • 수정 전

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    'use strict';
     
    const fs = require('fs');
    const path = require('path');
    const Sequelize = require('sequelize');
    const process = require('process');
    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' &&
          file.indexOf('.test.js'=== -1
        );
      })
      .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;
     
    module.exports = db;
    cs
  • 수정 후

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const Sequelize = require("sequelize");
     
    const env = process.env.NODE_ENV || "development";
    const config = require(__dirname + "/../config/config.json")[env];
    const db = {};
     
    const sequelize = new Sequelize(config.database, config.username, config.password, config);
     
    db.sequelize = sequelize;
     
    module.exports = db;
    cs
    • const Sequelize = require("sequelize");

      • 시퀄라이즈 모듈을 불러옵니다.
    • const env = process.env.NODE_ENV || "development";

      • process.env.NODE_ENV에서 현재 환경 변수를 가져옵니다.

      • 환경 변수가 설정되지 않은 경우, 기본값으로 "development"를 사용합니다.

    • const config = require(__dirname + "/../config/config.json")[env];

      • 데이터베이스 설정이 담긴 파일(config/config.json)을 불러와서, 현재 env에 맞는 설정을 가져옵니다.
    • const sequelize

      • 시퀄라이즈 객체를 생성하여 데이터베이스 연결을 설정합니다.

      • config.database: 데이터베이스 이름 입니다.

      • config.username: 사용자 이름 입니다.

      • config.password: 비밀번호 입니다.

      • config: 추가 옵션 입니다.

    • const db = {};

      • DB 객체를 정의합니다.

      • 데이터베이스 연결 및 모델을 관리하기 위해 사용됩니다.

    • db.sequelize = sequelize;

      • 생성한 시퀄라이즈 인스턴스를 db 객체에 추가하여, 다른 모듈에서 데이터베이스 연결을 사용할 수 있게 합니다.
    • module.exports = db;

      • db 객체를 모듈로 내보냅니다.

수정 파일(config/config.json)

development.password와 development.database를 현재 MySQL 커넥션과 일치하게 수정하면 됩니다.

MySQL 연결하기

  • 웹 서버를 구축, 데이터베이스 연결, 템플릿 엔진 설정, 미들웨어 설정, 에러 처리, 그리고 서버 시작까지 전체적인 애플리케이션의 기본 구조를 설정하는 역할을 합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    //app.js
    const express = require("express");
    const path = require("path");
    const morgan = require("morgan");
    const nunjucks = require("nunjucks");
     
    const { sequelize } = require("./models");
     
    const app = express();
    app.set("port", process.env.PORT || 3001);
    app.set("view engine""html");
    nunjucks.configure("views", {
        express: app,
        watch: true,
    });
    sequelize
        .sync({ force: false })
        .then(() => {
            console.log("데이터베이스 연결 성공");
        })
        .catch((err) => {
            console.error(err);
        });
     
    app.use(morgan("dev"));
    app.use(express.static(path.join(__dirname, "public")));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
     
    app.use((req, res, next) => {
        const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
        error.status = 404;
        next(error);
    });
     
    app.use((err, req, res, next) => {
        res.locals.message = err.message;
        res.locals.error = process.env.NODE_ENV !== "production" ? err : {};
        res.status(err.status || 500);
        res.render("error");
    });
     
    app.listen(app.get("port"), () => {
        console.log(app.get("port"), "번 포트에서 대기 중");
    });
    cs
  • sequelize 객체 가져오기

    1
    const { sequelize } = require("./models");
    cs
  • 데이터베이스 동기화

    1
    2
    3
    4
    5
    6
    7
    8
    sequelize
        .sync({ force: false })
        .then(() => {
            console.log("데이터베이스 연결 성공");
        })
        .catch((err) => {
            console.error(err);
        });
    cs
    • force: false는 기존 테이블을 삭제하지 않고 유지하겠다는 의미입니다.
  • config/config.json

    root 비밀번호는 mysql을 설치했을 때의 비밀번호를 입력해줍니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {
      "development": {
        "username": "root",
        "password": "[root 비밀번호]",
        "database": "nodejs",
        "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"
      }
    }
    cs
  • 서버 실행

    npm start로 서버를 실행하면 3001번 포트에서 서버가 잘 돌아가는 것을 볼 수 있었습니다.

0개의 댓글