ํฐ์คํ ๋ฆฌ ๋ทฐ
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๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ์ํด ๋ฐ๋ ๋ถ๋ถ์ด ์์ต๋๋ค.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <code> '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;</code> |
์ผ๋จ ์ง๊ธ๋ถํฐ๋ process.env๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ํ๊ฒฝ์ด ๊ฐ๋ฐํ๊ฒฝ์ธ์ง ์์ฉํ๊ฒฝ์ธ์ง ๊ตฌ๋ถํ๋ ๋ก์ง์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ ๋ ์ถ๊ฐ์ ์ผ๋ก localhost ํ๊ฒฝ๊น์ง ๊ตฌ๋ถํด์ผํ๋ ๋ถ๋ถ์ด ํ์ํ์ด์ BY_LOCAL์ด๋ผ๋ ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ์ธ์ ์ผ๋ก ์ถ๊ฐํด์ ๋ถ๊ธฐ์ฒ๋ฆฌํ์ต๋๋ค๋ง, ๋ณดํต์ development์ product๋ง์ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ๊ณค ํฉ๋๋ค.
๊ธฐ์กด์ ์ฝ๋์์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ตฌ๋ฌธ๋ง ์ถ๊ฐ๋์์ต๋๋ค.
sequelize.json ํ์ผ์ ์๋์ ๊ฐ์ ํ์์ผ๋ก ์์ฑํ์์ต๋๋ค.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <code>{ "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" : { // ์์ ๊ฐ์ ๊ตฌ์กฐ์
๋๋ค. } }</code> |
Object.keys() ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ๋ ค๋ DB config ์ ๋ณด๋ฅผ ๋ฝ์์ค๋ ๊ฒ๋ฐ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ exports๋๋ db ๋ชจ๋์ ๊ฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ํด๋น๋๋ ๋๋ ํ ๋ฆฌ์ entity ํ์ผ์ ์ฐธ์กฐํ๊ฒ๋ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ผ sequelize-auto ๋ชจ๋์ ์ฌ์ฉํ์ฌ entity๋ฅผ ๋ง๋๋ js ํ์ผ๋ ์์ ์ด ํ์ํ๊ฒ ๋ฉ๋๋ค. ์ด ๋ถ๋ถ์ ์ ๊ฐ ์ํฉ์ด ์ข ๊ธํ์ด์ ๋น์ฅ์ ์ข ๋ถํธํ๊ฒ ๋ง๋ค์์ต๋๋ค๋ง, ์ถํ์ ์์ ํ๋ ค๊ณ ํฉ๋๋ค.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <code>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' ); })</code> |
ํด๋น ํ์ผ์ ์คํํ์ ๋ ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ entity๋ง ์์ฑ์ด ๊ฐ๋ฅํ๊ฒ ๋์ด์์ต๋๋ค. ๊ทธ๊ฒ๋ ์คํ argument๋ฅผ ์ง๊ธ ๊ตฌ์กฐ์์๋ ์ซ์๋ก ์ค์ ๋ง์ด์ฃ . ๋์ค์๋ DB๋ช
์ผ๋ก ์คํ argument๋ฅผ ์ค์ entity๋ฅผ ์์ฑํ๊ฒ๋ ๋ณ๊ฒฝํ ์๊ฐ์
๋๋ค. ์ฝ๋๋ ๊ต์ฅํ ๊ฐ๋จํฉ๋๋ค.
entity๋ฅผ ๋ง๋๋ ค๋ DATABASE ์ config ์ ๋ณด๋ฅผ db ๋ฐฐ์ด ๋ณ์์ ์ ์ฅํฉ๋๋ค.ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ๋ชจ๋ ํ ์ด๋ธ๋ช ์ ๊ฐ์ ธ์ต๋๋ค.ํด๋น ํ ์ด๋ธ์ sequelize-auto ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํด๋น๋๋ ๋๋ ํ ๋ฆฌ์ js ํ์ผ ํํ์ entity๋ก ๋ชจ๋ ๋ณํํ์ฌ ์ ์ฅํฉ๋๋ค.
์ค์ ์ ๋ํ ์ ๋ณด๋ ์ฌ๊ธฐ๊น์ง๊ณ ๊ธฐ์กด์ฒ๋ผ
1 | <code>const model = require( './src/backend/model/entity' );</code> |
์์๊ฐ์ด 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
- nestjs typeorm
- Spring
- ํ๋ก๊ทธ๋๋จธ์ค
- @nestjs/config
- nestjs project
- Request_Limit_Exceeded
- JavaScript
- foreignkey
- Promise bulk
- typeorm
- nestjs module
- nestjs doc
- typeorm ์ฐ๊ฒฐ
- nestjs config
- ์๊ณ ๋ฆฌ์ฆ
- ๊ธฐ์์ฒญAPI
- sequelize
- nestjs/cli
- node.js
- node.js backend
- Promise error
- NestJS
- docker mysql
- android
- nestjs directory
- Spring Async
- DeferredResult
- nestjs configService
- ๋น๋๊ธฐ ์์ฒญ
- backend-framework
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |