ํฐ์คํ ๋ฆฌ ๋ทฐ
8.7 sequelize ์ฌ์ฉ ํ๊ฒฝ ์ค์ ๋ณ๊ฒฝ(useable multiple database in sequelize)
๋๋์ด๋ฐ๐พ 2019. 10. 27. 17:08์ฌ์ฉํ๋ค๋ณด๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์ด์ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ถํ์ ์ ๋ฐ์ดํธํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋๋ ํผ์ ๊ณต๋ถ๋ชฉ์ ์ผ๋ก ์ฐ๋ค๊ฐ ์ค๋ฌด์์ ์ ์ฉํ๋ ค๋ค๋ณด๋ ๊ธฐ์กด์ ์ฐ๋ ๊ตฌ์กฐ์์ ๋ณ๊ฒฝ์ ํ์์ฑ์ ๋๊ปด์ก์ต๋๋ค. ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ฉ๊ณผ ๊ฐ๋ฐํ๊ฒฝ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ค๋ฆ ๋๋ค.ํ๋์ ํ๋ก๊ทธ๋จ์์ ํ์์ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ด ๊ฐ๋ฅํด์ผํฉ๋๋ค.๊ฐ๋ฐ์๋ฒDB์ ์์ฉ์๋ฒDB๊ฐ ์๋ฒฝํ๊ฒ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ entity ์์ฑ๋ ๋ณ๊ฐ๋ก ๋์ด์ผํฉ๋๋ค.
์ด์ ์ฑํฐ๊น์ง ์งํํ๋ค๋ฉด sequelize ๋ฌธ๋ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ js ํ์ผ๋ค (๋ณดํต entity๋ผ๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.) ์ด ์์ฑ๋์์ ๊ฒ๋๋ค. ํ์ง๋ง ์์๊ฐ์ ์ ์ฝ์ฌํญ์ ํด๊ฒฐํด์ผํ๋ค๋ฉด index.js ํ์ผ๋ถํฐ sequelize-auto ๋ชจ๋์ ์ฌ์ฉํ์ฌ entity๋ฅผ ์์ฑํ๋ js ํ์ผ๋ ์์ ์ด ํ์ํฉ๋๋ค.
์ง๊ธ๋ถํฐ ์ฐ๋ ์ฝ๋๋ ๊ธฐ์กด๊ณผ ๋ค๋ฅธ ํ๊ฒฝ์์ ์์ฑ๋๋ ์ฝ๋์ด๋ฏ๋ก ํ์ผ๊ฒฝ๋ก๋ DB๋ช
์ ์ ํ ๋ค๋ฆ
๋๋ค. ์ผ๋จ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ์ด๋ ์ต๋๋ค.
_DEV์ด ๋ถ๋ ๋๋ ํ ๋ฆฌ๋ ๊ฐ๋ฐ์๋ฒ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ๊ทธ์ ๋ฐ๋๋ก _DEV๊ฐ ์์ผ๋ฉด ์์ฉ์๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ๊ฑฐ์ฃ . sequelize ์ปค๋ฅ์
์ ๋ฐํํ๋ index.js ์ฝ๋๋ multiple database connection๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ์ํด ๋ฐ๋ ๋ถ๋ถ์ด ์์ต๋๋ค.
'use strict';
var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(__filename);
var env = process.env.NODE_ENV;
var config = {};
var db = {};
if (process.env.BY_LOCAL) {
config = require(__dirname + '/../../../../config/sequelize.local.json')[env];
} else {
config = require(__dirname + '/../../../../config/sequelize.json')[env];
}
/* Add Databases */
const databases = Object.keys(config.databases);
for(let i=0; i < databases.length; i++) {
let database = databases[i];
let dbPath = config.databases[database];
db[database] = new Sequelize(dbPath.database, dbPath.username, dbPath.password, dbPath);
}
fs
.readdirSync(__dirname + `/${databases[0]}`)
.filter(file =>
(file.indexOf('.') !== 0) &&
(file !== basename) &&
(file.slice(-3) === '.js'))
.forEach(file => {
const model = db[`${databases[0]}`].import(path.join(__dirname + `/${databases[0]}`, file));
db[model.name] = model;
});
// Add models from database
fs
.readdirSync(__dirname + `/${databases[1]}`)
.filter(file => {
(file.indexOf('.') !== 0) &&
(file !== basename) &&
(file.slice(-3) === '.js');
})
.forEach(file => {
const model = db[`${databases[1]}`].import(path.join(__dirname + `/${databases[1]}`, file));
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
module.exports = db;
์ผ๋จ ์ง๊ธ๋ถํฐ๋ process.env๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ํ๊ฒฝ์ด ๊ฐ๋ฐํ๊ฒฝ์ธ์ง ์์ฉํ๊ฒฝ์ธ์ง ๊ตฌ๋ถํ๋ ๋ก์ง์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ ๋ ์ถ๊ฐ์ ์ผ๋ก localhost ํ๊ฒฝ๊น์ง ๊ตฌ๋ถํด์ผํ๋ ๋ถ๋ถ์ด ํ์ํ์ด์ BY_LOCAL์ด๋ผ๋ ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ์ธ์ ์ผ๋ก ์ถ๊ฐํด์ ๋ถ๊ธฐ์ฒ๋ฆฌํ์ต๋๋ค๋ง, ๋ณดํต์ development์ product๋ง์ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ๊ณค ํฉ๋๋ค.
๊ธฐ์กด์ ์ฝ๋์์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ตฌ๋ฌธ๋ง ์ถ๊ฐ๋์์ต๋๋ค.
sequelize.json ํ์ผ์ ์๋์ ๊ฐ์ ํ์์ผ๋ก ์์ฑํ์์ต๋๋ค.
{
"development": {
"logging": true,
"databases": {
"SEASON3_DEV":
{
"acquireTimeout": 5000,
"connectionLimit" : 30,
"timezone": "+09:00",
"charset": "utf8mb4",
"database": "SEASON3_DEV",
"username": "์ ์ ๋ค์",
"password": "๋น๋ฐ๋ฒํธ",
"host": "localhost",
"port": "ํฌํธ๋ฒํธ",
"dialect": "mysql",
"define":{
"timestamps" : false,
"underscored" : false
}
},
"STORE_DEV":
{
"acquireTimeout": 5000,
"connectionLimit" : 30,
"timezone": "+09:00",
"charset": "utf8mb4",
"database": "STORE_DEV",
"username": "์ ์ ๋ค์",
"password": "๋น๋ฐ๋ฒํธ",
"host": "localhost",
"port": "ํฌํธ๋ฒํธ",
"dialect": "mysql",
"define":{
"timestamps" : false,
"underscored" : false
}
}
}
},
"production": {
// ์์ ๊ฐ์ ๊ตฌ์กฐ์
๋๋ค.
}
}
Object.keys() ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ๋ ค๋ DB config ์ ๋ณด๋ฅผ ๋ฝ์์ค๋ ๊ฒ๋ฐ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ exports๋๋ db ๋ชจ๋์ ๊ฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ํด๋น๋๋ ๋๋ ํ ๋ฆฌ์ entity ํ์ผ์ ์ฐธ์กฐํ๊ฒ๋ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ผ sequelize-auto ๋ชจ๋์ ์ฌ์ฉํ์ฌ entity๋ฅผ ๋ง๋๋ js ํ์ผ๋ ์์ ์ด ํ์ํ๊ฒ ๋ฉ๋๋ค. ์ด ๋ถ๋ถ์ ์ ๊ฐ ์ํฉ์ด ์ข ๊ธํ์ด์ ๋น์ฅ์ ์ข ๋ถํธํ๊ฒ ๋ง๋ค์์ต๋๋ค๋ง, ์ถํ์ ์์ ํ๋ ค๊ณ ํฉ๋๋ค.
const async = require('async');
const sequelizeAuto = require('sequelize-auto');
const model = require('../src/backend/model/entity');
const env = process.env.NODE_ENV;
let config = {};
if (process.env.BY_LOCAL) {
config = require('../config/sequelize.local.json')[env];
} else {
config = require('../config/sequelize.json')[env];
}
let db = [];
/* Add Databases */
Object.keys(config.databases).map(v=>{
db.push({
DATABASE: config.databases[v].database,
USERNAME: config.databases[v].username,
PASSWORD: config.databases[v].password,
HOST: config.databases[v].host
})
})
const tasks = [
//ํ
์ด๋ธ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ (DB ๋ถ๊ธฐ ์ ์์ฒ๋ฆฌ ๋์ด์์.)
function(callback) {
model[db[process.argv[2]].DATABASE].query('show tables')
.then((rows)=>{
callback(null, rows[0])
})
.catch((err)=>{
callback(err);
})
},
//ํ
์ด๋ธ ๋ชฉ๋ก ๋ฐฐ์ด์ ์ ์ฅ
function(rows,callback) {
let tables = [];
rows.map(v=>tables.push(v[`Tables_in_${db[process.argv[2]].DATABASE}`]) );
callback(null, tables);
},
//sequelize-auto ๋ชจ๋๋ก ํด๋น DB์ ๋ชจ๋ ํ
์ด๋ธ entity ํ์ผ ์์ฑ
function(tables,callback) {
const auto = new sequelizeAuto(db[process.argv[2]].DATABASE,db[process.argv[2]].USERNAME,db[process.argv[2]].PASSWORD,{
host: db[process.argv[2]].HOST,
tables: tables,
directory: `./src/backend/model/entity/${db[process.argv[2]].DATABASE}`
})
auto.run((err)=>{
if(err) throw err;
})
callback(null);
},
];
async.waterfall(tasks, (err)=>{
if(err)
console.log(err);
else
console.log('done');
})
ํด๋น ํ์ผ์ ์คํํ์ ๋ ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ entity๋ง ์์ฑ์ด ๊ฐ๋ฅํ๊ฒ ๋์ด์์ต๋๋ค. ๊ทธ๊ฒ๋ ์คํ argument๋ฅผ ์ง๊ธ ๊ตฌ์กฐ์์๋ ์ซ์๋ก ์ค์ ๋ง์ด์ฃ . ๋์ค์๋ DB๋ช
์ผ๋ก ์คํ argument๋ฅผ ์ค์ entity๋ฅผ ์์ฑํ๊ฒ๋ ๋ณ๊ฒฝํ ์๊ฐ์
๋๋ค. ์ฝ๋๋ ๊ต์ฅํ ๊ฐ๋จํฉ๋๋ค.
entity๋ฅผ ๋ง๋๋ ค๋ DATABASE ์ config ์ ๋ณด๋ฅผ db ๋ฐฐ์ด ๋ณ์์ ์ ์ฅํฉ๋๋ค.ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ๋ชจ๋ ํ ์ด๋ธ๋ช ์ ๊ฐ์ ธ์ต๋๋ค.ํด๋น ํ ์ด๋ธ์ sequelize-auto ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํด๋น๋๋ ๋๋ ํ ๋ฆฌ์ js ํ์ผ ํํ์ entity๋ก ๋ชจ๋ ๋ณํํ์ฌ ์ ์ฅํฉ๋๋ค.
์ค์ ์ ๋ํ ์ ๋ณด๋ ์ฌ๊ธฐ๊น์ง๊ณ ๊ธฐ์กด์ฒ๋ผ
const model = require('./src/backend/model/entity');
์์๊ฐ์ด entity ๋๋ ํ ๋ฆฌ๋ฅผ requireํ๋ฉด ํด๋น ๋๋ ํ ๋ฆฌ์ index.js ํ์ผ์ ์ฐธ์กฐํ๊ฒ ๋์ด์์ต๋๋ค. ๊ทธ๋ผ index.js ์์ ์ฐ๋ฆฌ๊ฐ ๋ฐํํ๊ฒ ๋ง๋ db ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐฉ์์ ๊ธฐ์กด๊ณผ ๋์ผํฉ๋๋ค. ๋จ, ์ฌ์ฉ ์์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ๊ฑด์ง ํ๋กํผํฐ๋ฅผ ๊ทธ๋๊ทธ๋ ์์ฑํด์ค์ผํฉ๋๋ค.
'Node.js > Node.js ๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
8.6 sequelize-auto ๋ชจ๋ ์ฌ์ฉํ๊ธฐ (0) | 2019.03.07 |
---|---|
8.5 Sequelize ์ธ๋ํค๋ก ์ฐธ์กฐ ํ ์ด๋ธ ๋ฐ์ดํฐ ๊ฒ์ํ๊ธฐ (0) | 2018.11.01 |
8.4 Sequelize ๋ก DML ๊ตฌํํด๋ณด๊ธฐ (0) | 2018.10.06 |
8.3 Sequelize foreignKey ์ง์ ํ๊ธฐ(cascade ์ ์ฉ) (0) | 2018.09.27 |
8.2 Sequelize ํ๊ฒฝ settingํ๊ธฐ (0) | 2018.06.28 |
- Total
- Today
- Yesterday
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋น๋๊ธฐ ์์ฒญ
- backend-framework
- typeorm
- Promise bulk
- node.js
- @nestjs/config
- ์๊ณ ๋ฆฌ์ฆ
- DeferredResult
- Request_Limit_Exceeded
- android
- nestjs/cli
- nestjs module
- Spring Async
- nestjs directory
- JavaScript
- nestjs configService
- nestjs typeorm
- nestjs project
- nestjs doc
- docker mysql
- sequelize
- typeorm ์ฐ๊ฒฐ
- nestjs config
- Promise error
- NestJS
- node.js backend
- foreignkey
- Spring
- ๊ธฐ์์ฒญAPI
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |