ORM(Object-Relational Mapping)은 객체지향 패러다임을 활용하여 관계형 데이터베이스(RDB)의 데이터를 조작하게 하는 기술이다. 이를 활용하면 쿼리를 작성하지 않고도 객체의 메서드를 활용하는 것처럼 쿼리 로직을 작성할 수 있다. Node.js의 대표적인 ORM인 Sequelize이 있다. Sequelize는 MySQL, PostgreSQL, MariaDB 등 많은 RDBMS를 지원하고 Promise 기반으로 구현되었기 때문에 비동기 로직을 편리하게 작성할 수 있다.
Sequelize 설치
npm i sequelize sequelize-cli mysql2
- sequelize : 시퀄라이즈 사용
- sequelize-cli : 시퀄라이즈 명령어를 사용
- mysql2 : MySQL과 연결해주는 드라이버
npx sequelize init
위 명령어를 실행하면 config, migrations, models, seeders 4개의 디렉토리가 생성된다.
1) config
- config : sequelize를 사용하기 위한 환경 설정이다. 총 세 개의 설정이 있는데, 개발용, 테스트, 배포용이 있다. 거의 development모드를 사용할텐데 잘못 이해해서 처음에 조금 애먹었다. mysql설정하는 것과 같고, dialect부분은 db종류를 쓰면 된다. 이는 mysql, mariadb, sqlite등 자신이 쓰는 것에 맞춰 쓰면 된다.
{
"development": {
"username": "username",
"password": "password",
"database": "database",
"host": "host",
"dialect": "mysql"
},
}
2) models
- models : 테이블을 정의하고 관계를 설정한다.
'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;
//config/config.js 파일에 있는 정보를 가져와 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);
}
// 우리가 작성한 Table파일을 찾아온다.
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;
});
//DB에 모델이름을 연결한다.
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
- migrations : 데이터베이스에 테이블에 필드 정보가 변경되거나 구조가 바뀌는 등과 상황에서 사용된다. 실제 데이터베이스에 반영할 수도 있고 변화를 취소할 수도 있다.
- seeders : 서버를 실행하거나 콘솔 창에서 명령어를 실행 시 sequelize를 통해 DB에 데이터를 생성할 때 사용된다.
DB 생성
1) database 생성
sequelize db:create
→ 위와 같이 터미널에 명령어를 입력하면, config.json에 있던 정보가 맞으면 db가 생성이 된다. 그렇지 않은 경우 생성이 되지 않는다.
2) model 생성
models 파일에 들어가서, index.js은 놔두고 하나의 파일을 더 생성한다. User.js를 생성해주고 아래와 같이 모델을 정의해준다.
module.exports = (sequelize, DataTypes) => {
const Users = sequelize.define("Users", {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
},
email: {
type: DataTypes.STRING(100),
validate: {
isEmail: true,
},
},
name: {
type: DataTypes.STRING(100),
},
}, {
charset: "utf8", // 한국어 설정
collate: "utf8_general_ci", // 한국어 설정
tableName: "Users", // 테이블 이름 정의
timestamps: true, // createAt, updateAt 자동 생성
paranoid: true, // deleteAt 옵션
});
return Users;
};
나머지 설정은
underscored: false, // sequelize에서 _(언더바)를 사용할지 말지 ex) createAt -> create_at
modelName: 'User', // modelName - javascript에서 쓰인다.
tableName: 'users', // tableName - SQL에서 쓰이며, modelName의 소문자로 하고, 복수형으로 짓는다.
3) db와 model 연결
내 경우 node.js와 express를 사용해주기에 express모듈을 사용하여 db와 model을 연결해준다.
const express = require('express');
const app = express();
const { sequelize } = require('./models');
sequelize.sync({ force: false })
.then(() => {
console.log('데이터베이스 연결 성공');
})
.catch((err) => {
console.error(err);
});
app.get('/', function (req, res) {
res.send('Hello Express')
})
app.listen(3000, () => console.log('start..'));
위와 같이 설정해주는데 sequelize를 설정해줄 때 models파일의 위치가 다를 수 있기에 자신의 models파일의 위치를 잘 보고 설정해준다. 나는 server.js에 저 코드를 써주고 front라는 파일에 넣었기 때문에 db라는 파일을 만들어서 sequelize 생성했다. 그래서 파일 위치가 달라서 다르게 설정해주었다.
그리고 위와 같이 작성한 코드가 있는 express를 수행해주면, 데이터베이스 연결 성공이라는 문장이 뜬다.
그렇게 뜬게 보일 것이다. 그럼 성공한 것이다. 저기서 desc는 describe를 의미한다. desc, describe 둘 중 아무거나 써도 상관없다.
아래와 같은 사이트를 참고하여 작성하였습니다.
https://velog.io/@limsw/NodeJS-Sequelize-사용-방법-및-Mysql-연동하기
https://baeharam.netlify.app/posts/Node.js/Node.js-Sequelize-다루기
https://velog.io/@xka926/회원가입-및-로그인-구현-2