goal
- sequelize에 대해서 알아보자.
npm install --save sequelize
sequelize CLI 설치 : 마이그레이션을 할 수 있도록 돕는 툴로, CLI에서 모델을 생성해주거나, 스키마 적용을 할 수 있도록 돕는다.
: npm install --save-dev sequelize-cli
다음으로는, CLI를 통해 ORM을 잘 사용할 수 있도록 bootstraping (프로젝트 초기 단계를 자동으로 설정할 수 있도록 도와주는 일)을 해줘야 한다.
: npx sequelize-cli init
(빈 프로젝트 만들기) 를 통해 실행
성공적으로 bootstraping이 끝나면, 아래 폴더들이 생성된다.
// like this
{
"development": {
"username": "root", // !!
"password": null,
"database": "database_development", // !!
"host": "127.0.0.1",
"dialect": "mysql" // 기본설정이 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"
}
}
'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';
//! env : 환경설정 변수
// config 파일보면, sequelize 환경설정을 할 수 있다.
// "development" : 개발환경
// "test" : 테스트환경
// "production" : 배포환경
// username : DB 아이디
// password : DB 비번
// database : DB 이름
// host : local
// dialect : DB설정 (default로 mysql)
const config = require(__dirname + '/../config/config.json')[env];
//! config : 환경설정 계속
// __dirname 이 현재 실행 중인 폴더 경로 + config.json파일에서
// 전체가 하나의 객체로 묶여 있음
// 그 중, 변수 env는 현재, "development"로 설정했으므로,
// const config =
// "development": {
// "username": "root",
// "password": ,
// "database": "database_development",
// "host": "127.0.0.1",
// "dialect": "mysql"
// } 이 객체를 가져온다.
// 객체에 키를 넣듯이, [env]로 추가한다.
const db = {};
// 변수 db에 빈 객체 생성
let sequelize;
if (config.use_env_variable) {
//! 질문 : use_env_variable 이거는 뭐지?
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
//! sequelize
// Sequelize는 생성자, 인스턴스화(sequelize) 한다.
// database, username, password와 나머지 정보를 가져온다.
}
// 그 다음에 db객체에 (아래)
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;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
//! 위에서 만든 db객체( { } )에
// 인스턴스화 한 sequelize도 넣고
// Sequelize 패키지도 넣는다.
// 그 다음, 이 db객체를 exports로 내보낸다.
// db를 모듈로 사용하기 위함이다.
module.exports = db;
// migration 파일
// - up은 테이블 생성, down은 테이블 삭제와 관련된 코드다.
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('urls', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
url: {
type: Sequelize.STRING
},
title: {
type: Sequelize.STRING
},
visits: {
type: Sequelize.INTEGER,
defaultValue:0 // 초기값을 0으로 설정
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('urls');
}
};
// models/url.js 파일
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class url extends Model {
static associate(models) {
}
};
url.init({
url: DataTypes.STRING,
title: DataTypes.STRING,
visits: {type:DataTypes.INTEGER, defaultValue:0}
}, {
sequelize,
modelName: 'url',
});
return url;
};
모델 생성
: npx sequelize-cli model:generate --name Url --attributes url:string,title:string,visits:integer
모델을 생성하는데, 테이블명은 Url, 필드는 url, title, visits 그리고 자동생성되는 createdAt, updadtedAt
running migration
: npx sequelize-cli db:migrate
undo migration
: npx sequelize-cli db:migrate:undo