오늘은 Sequelize
라는 라이브러리에 대해서 소개하려고 합니다. 시퀄라이즈
는 노드에서 관계형 데이터베이스 작업을 편리하게 수행할 수 있도록 도와주는 라이브러리입니다.
여러 관계형 데이터베이스가 있지만 여기서는 MySQL을 이용하도록 하겠습니다. 또한 웹 서버 라이브러리로 익스프레스 라이브러리를 사용하고 있습니다.
시퀄라이즈
는 ORM(Object Relation Mapping)
이라고 부르는 라이브러리입니다. 그 이름처럼 자바스크립트의 객체와 데이터베이스 릴레이션(테이블)을 매핑해줍니다. 게다가 단순히 매핑하는 것만이 아닌 자바스크립트 구문을 자동적으로 SQL로 변환해줍니다. 그 덕분에 자바스크립트만으로 데이터베이스를 다룰수 있다는 장점이 생기게 됩니다.
여담으로, SQL을 몰라도 시퀄라이즈를 이용해서 DB조작이 가능합니다. 하지만 SQL의 기본 명령들을 이해하고 있어야만 제대로 사용할 수 있겠죠?
시퀄라이즈는 다음 명령어로 설치합니다.
npm install sequelize sequelize-cli
sequelize-cli
는 시퀄라이즈 명령어를 사용하기 위한 패키지입니다.
그리고 우리는 익스프레스와 MySQL을 사용할 예정이니 아래 패키지들도 설치해주세요.
npm install express mysql2 morgan
npm install -D nodemon
mysql2
는 시퀄라이즈와 MySQL을 연결해주는 드라이버 패키지입니다. morgan
은 로깅(logging)기능이 있는 패키지입니다. 여러 에러 탐지에 도움을 줍니다.
패키지 설치가 완료됐다면 다음 명령어로 프로젝트 폴더를 설정합니다.
npx sequelize init
이 명령어를 수행하면 프로젝트 폴더에 config, models, migrations, seeders
의 폴더가 생성되고 몇가지 기본 설정 파일이 생성됩니다.
/models/index.js
에 기본적으로 생성된 코드는 불필요한 내용이 많아 아래 내용으로 대체합니다.
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config.json')[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
module.exports = db;
참고로 연결 전에 MySQL이 켜져있고, 데이터베이스가 생성되어 있어야합니다. 실습을 위해 저는 seq
라는 데이터베이스를 하나 만들었습니다.
그리고 ./config/config.json
에서 설정을 합니다. 간단한 실습이라 test, production
은 이용하지 않을 예정이니 제일 상단의 "development"
부분을 수정해주세요.
"development": {
"username": "root",
"password": "root 비밀번호", //MySQL 설치과정에서 설정한 root 계정 비밀번호
"database": "seq", //생성한 데이터베이스 이름
"host": "127.0.0.1",
"dialect": "mysql"
},
그리고 nodemon 실행을 위해 package.json
에 다음 내용도 추가해주세요.
"scripts": {
"start": "nodemon app"
},
이제 익스프레스로 만드는 앱과 MySQL을 연결해보겠습니다. 최상위 위치에 app.js
를 생성하고 다음과 같이 작성해주세요.
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const { sequelize } = require('./models');
const app = express();
app.set('port', process.env.PORT || 3001);
sequelize.sync({ force: false })
.then(() => console.log('DB 연결 성공!'))
.catch(e => console.error(e));
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'), '번 포트에서 대기중 '));
작성 후 터미널에 npm start
를 입력합니다.위 사진과 같은 결과가 나오면 DB 연결에 성공한 것 입니다.
만약 실패하는 경우에 mysql이 실행중인지, 계정과 계정 비밀번호를 제대로 입력했는지, 사용하고자 하는 데이터베이스가 존재하는지, 이름은 맞는지를 확인해주세요.