본문 바로가기

Back-End/Node.js

시퀄라이즈(Sequelize)

반응형

1. MySQL

1.1 DBMS

데이터베이스란 관련성을 가지며 중복이 없는 데이터들의 집합을 말한다.

이러한 데이터베이스를 관리하는 시스템을 DBMS(DataBase Management System)이라고 한다.

1.2 RDBMS

데이터베이스를 관리하는 DBMS 중에서 RDBMS(Relational DBMS)라고 부르는 관계형 DBMS가 많이 사용된다.

  • Oracle, MySQL, MSSQL, ...
  • SQL 언어를 사용하여 데이터를 관리한다.
  • RDBMS별로 SQL문이 조금씩 다르다.

 

2. 시퀄라이즈

노드에서 MySQL 데이터베이스에 접속할 때, MySQL 작업을 쉽게 할 수 있도록 도와주는 라이브러리가 바로 시퀄라이즈(Sequelize)이다.

2.1 시퀄라이즈

시퀄라이즈는 *ORM(Object-relational Mapping)으로 분류된다.

(*ORM: 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구)

  • MySQL뿐만 아니라 MariaDB, PostgreSQL, SQLite, MSSQL 등 다른 데이터베이스도 같이 쓸 수 있다.
  • 문법이 어느 정도 호환되므로 프로젝트를 다른 SQL 데이터베이스로 전환할 때도 편리하다.

사용 이유

자바스크립트 구문을 알아서 SQL로 바꿔준다.

  • 따라서 SQL 언어를 직접 사용하지 않고 자바스크립트만으로도 MySQL을 다룰 수 있다.
  • 하지만 SQL을 모르는 채로 시퀄라이즈를 사용하는 것은 권장되지 않는다.

 

2.2 시퀄라이즈 사용하기

시퀄라이즈 실습을 위한 새 프로젝트를 생성하자. learn-sequelize 폴더 안에 package.json을 생성한다.

직접 생성하여 작성해도 되고, 터미널에 아래 코드를 입력하여 손쉽게 만들 수도 있다.

$ npm init
// package.json
{
  "name": "learn-sequelize",
  "version": "1.0.0",
  "description": "시퀄라이즈를 배우자",
  "main": "app.js",
  "scripts": {
    "test": "nodemon app"
  },
  "author": "nno3onn",
  "license": "ISC"
}

이제 시퀄라이즈에 필요한 sequelize와 sequelize-cli, mysql2 패키지를 설치하자.

  • sequelize-cli : 시퀄라이즈 명령어를 실행하기 위한 패키지
  • mysql2 : MySQL과 시퀄라이즈를 이어주는 드라이버
$ npm i express morgan nunjucks sequelize sequelize-cli mysql2
npm i -D nodemon

설치가 완료되면 package.json > dependencies가 자동으로 추가된다.

{
  "name": "learn-sequelize",
  "version": "1.0.0",
  "description": "시퀄라이즈를 배우자",
  "main": "app.js",
  "scripts": {
    "test": "nodemon app"
  },
  "author": "nno3onn",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "morgan": "^1.10.0",
    "mysql2": "^2.2.5",
    "nunjucks": "^3.2.3",
    "sequelize": "^6.6.2",
    "sequelize-cli": "^6.2.0"
  }
}

설치 완료 후 sequelize init 명령어를 호출한다. 전역 설치 없이 명령어로 사용하려면 앞에 npx를 붙이면 된다.

$ npx sequelize init

명령어를 작성하면 config, models, migrations, seeders 폴더가 생성된다. models 폴더 안에 index.js가 생성되었는지 확인하자.

이때 sequelize-cli가 자동으로 코드를 생성해준다. 하지만 이들은 그대로 사용할 때 에러가 발생하고 필요 없는 부분들도 많으므로 아래와 같이 수정하자.

// models/index.js
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};

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

module.exports = db;
  • Sequelize: 시퀄라이즈 패키지이자 생성자.

config/config.json에서 데이터베이스 설정을 불러온 후 new Sequelize를 통해 MySQL 연결 객체를 생성한다. 연결 객체를 나중에 재사용하기 위해서 db.sequlize에 넣어두었다.

 

2.2.1 MySQL 연결하기

이제 시퀄라이즈를 통해 익스프레스 앱과 MySQL을 연결해야 한다. app.js를 생성하고 익스프레스와 시퀄라이즈 연결 코드를 작성하자.

// 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'), '번 포트에서 대기 중');
});
  • require('./models')는 require('./models/index.js')와 동일하다. 폴더 내의 index.js 파일은 require 시 이름을 생략할 수 있다.
  • db.sequelize를 불러오고 sync 메서드를 사용하여 서버 실행 시 MySQL과 연동되도록 한다.
    • 내부에 force: false 옵션이 있는데, 이 옵션을 true로 설정하면 서버 실행 시마다 테이블을 재생성한다. 테이블을 잘못 만든 경우에 true로 설정하면 된다.

MySQL과 연동할 때는 config 폴더 안의 config.json 정보가 사용된다. 아래와 같이 수정하자. 자동 생성한 config.json에 operatorAliases 속성이 들어있다면 삭제하자.

// config/config.json
{
  "development": {
    "username": "root",
    "password": 6331,
    "database": "node.js",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  ...
}

development.passworddevelopment.database현재 MySQL 커넥션과 일치하게 수정하면 된다.

test는 테스트 용도, production은 배포 용도로 접속하기 위해 사용되는 것이므로 현재는 설정하지 않는다.

 

반응형