본문 바로가기
Javascript/Node.js

[NodeJS][GCP][MySQL] NodeJS서버로 GCP MySQL DB에 Sequelize 연결하기

by 오늘의개발부 2020. 5. 18.
반응형

 

크게 2가지 방식이 있다.

1. TCP/IP 연결방식

- GCP MySQL에 TCP/IP를 통해 접근할 수 있다.

- GCP 외부, 즉 당신이 사용하고 있는 개발PC에서 이 방식을 사용하려면 GCP의 가이드에 따라 Proxy 설정을 해야한다.(https://cloud.google.com/sql/docs/mysql/connect-external-app?hl=ko)

- Proxy 설정이 번거롭다면 [GCP console] - [좌측메뉴 SQL] - [인스턴스ID 클릭] - [좌측메뉴 연결] 공개IP에 개발PC의 IP주소를 추가한다.

  var base = new Sequelize(config.database, config.user, config.password, {
    host: config.host,
    port: config.port,
    dialect: 'mysql',
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000
    },
    define: {
      engine: 'innodb',
      freezeTableName: true, 
      timestamps: false, 
    },
  });

 

 

2. domain socket 연결방식

- GCP 내부에서는 별도 인증없이 domain socket을 통해 연결할 수 있다. 단, 다른 프로젝트이거나 MySQL이 표준이 아니고 유연성이라면 설정이 필요하다. 나는 만난 문제가 아니니 이후에 공식문서를 열심히 봐보자.(https://cloud.google.com/sql/docs/mysql/connect-app-engine?hl=ko#standard)

- GCP 외부, 즉 당신이 사용하고 있는 개발PC에서 이 방식을 사용하려면 GCP의 가이드에 따라 Proxy 설정을 해야한다.

- Proxy 설정이 번거롭다면 [GCP console] - [좌측메뉴 SQL] - [인스턴스ID 클릭] - [좌측메뉴 연결] 공개IP에 개발PC의 IP주소를 추가한다.

var base = new Sequelize(config.database, config.user, config.password, {
    host: `/cloudsql/${config.socketPath}`,
    port: config.port,
    dialect: 'mysql',
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000
    },
    dialectOptions: {
        socketPath: `/cloudsql/${config.socketPath}`
    },
    define: {
      engine: 'innodb',
      freezeTableName: true, 
      timestamps: false, 
    },
  });

 

 

 

 

3. 내가하는 방식

- 개발PC에 프록시 설정까지도 번거로워서 개발시에는 개발PC의 IP를 승인하고 TCP/IP 연결방식으로 작업한다. 그러고 실서버로 사용하고 있는 App Engine 내부에서는 domain socket으로 연결되도록 했다.

- global.js

// global config
var config = new Map();

// mysql
config.set("type","dev");
config.set('mysql', {
  host: '12.34.56.789',
  port: 3306,
  user: 'root', 
  password: '123456789qwer', 
  database: 'databasename',
  socketPath: 'INSTANCE_CONNECTION_NAME:asia-northeast3:INSTANCE_CONNECTION_NAME'
});

// merge config from local.js
// if local.js is existed and local.js defines the configuration is used to local's, otherwise use global's
// like array_merge function in php
var fs = require('fs');
if (fs.existsSync(__dirname + '/local.js')) {
  var customer = require('./local');
  customer.forEach(function (value, key) {
    config.set(key, value);
  });
}

module.exports = config;

 

- base.js

// load
var type = require('../config/global').get('type');
var config = require('../config/global').get('mysql');
var Sequelize = require('sequelize');

// ORM Instance create
console.log("TYPE : ", type);
if(type == "dev"){
  var base = new Sequelize(config.database, config.user, config.password, {
    host: config.host,
    port: config.port,
    dialect: 'mysql',
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000
    },
    define: {
      engine: 'innodb',
      freezeTableName: true, 
      timestamps: false, 
    },
    // timezone: '+09:00'
  });
}
if(type == "pdct"){
  var base = new Sequelize(config.database, config.user, config.password, {
    host: `/cloudsql/${config.socketPath}`,
    port: config.port,
    dialect: 'mysql',
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000
    },
    dialectOptions: {
        socketPath: `/cloudsql/${config.socketPath}`
    },
    define: {
      engine: 'innodb',
      freezeTableName: true, 
      timestamps: false, 
    },
    // timezone: '+09:00'
  });
}
console.log('Create ORM Object!');

module.exports = base;
반응형