본문 바로가기
개발 이야기/NodeJS

초간단 Express + Mysql 환경 셋팅

by 농개 2019. 5. 14.
반응형

Nodejs로 Mysql 연동 방법을 알아봅니다.

Express 프레임워크를 사용해서 간단한 API 서버를 만들려고합니다.

 

mysql이라는 라이브러리를 설치해 사용하면 됩니다.

 

01. mysql 라이브러리 설치

npm install --save mysql

 

 

02. config.js 파일 작성

./config.js

const config = {
  host     : '***************.rds.amazonaws.com',
  user     : 'username',
  password : 'password',
  port     : 3306,
  database : 'dbname',
  connectionLimit : 10
};

module.exports = config;

위와 같이 config정보를 따로 파일로 관리하였습니다. (미리 구축해놓은 AWS RDS 사용)

 

 

 

 

 

03. 로깅 파일 작성

./logger.js

const appRoot = require('app-root-path');
const winston = require('winston');
const process = require('process');

const { combine, timestamp, label, printf } = winston.format;

const myFormat = printf(({ level, message, label, timestamp }) => {
  return `${timestamp} [${label}] ${level}: ${message}`;
});

const options = {
  file: {
    // 로그 파일 저장시... 작성
  }
  console: {
    level: 'debug',
    handleExceptions: true,
    json: false,
    colorize: true,
    format: combine(
      label({ label: 'express_server' }),
      timestamp(),
      myFormat
    )
  }
}

let logger = new winston.createLogger({
  transports: [
    new winston.transports.Console(options.console)
  ],
  exitOnError: false, // do not exit on handled exceptions
});


logger.stream = {
  write: function(message, encoding) {
    logger.info(message);
  },
};

module.exports = logger;

위와 같이 간단히 작성합니다.

그리고 아래 명령어로 관련 라이브러리 설치해줍니다.

 

npm install --save winston app-root-path

 

 

04. DB 커넥션 풀을 제공하는 모듈 작성

./db.js

const mysql = require("mysql");
const config = require("./config");
const logger = require('./logger');

const pool = mysql.createPool(config);
logger.info('Connection pool created.');

pool.on('acquire', function (connection) {
  logger.info(`Connection ${connection.threadId} acquired`);
});

pool.on('enqueue', function () {
  logger.info('Waiting for available connection slot');
});

pool.on('release', function (connection) {
  logger.info(`Connection ${connection.threadId} released`);
});

const getConn = function(callback) {
  pool.getConnection(function(err, connection) {
    callback(err, connection);
  });
}

module.exports = getConn;
  • createPool 메서드로 DB Connection Pool을 손쉽게 만들수 있습니다.
  • 간단한 pool event 등록 해줬습니다(acquire, enqueue, release)
  • getConn이라는 메서드를 만들어 DB 연결이 필요할 때 pool로 부터 연결세션을 제공받아 사용하려고합니다.

 

05. API 작성

./routes/index.js

/routes/member.js

// index.js
const express = require('express');
const member = require('./member');

const router = express.Router();

router.use('/member', member);

module.exports = router;


// member.js
const express = require("express");
const db = require("../db");

const router = express.Router();

router.get("/", (req, res) => {
  // db select문 수행
  db((err, connection) => {
    connection.query("SELECT * FROM MEMBER", (err, rows) => {
      connection.release(); // 연결세션 반환.
      if (err) {
        throw err;
      }

      return res.json({ data: rows }); // 결과는 rows에 담아 전송
    });
  });
});

module.exports = router;

 

 

06. 결과

해당 url을 호출 해 봤더니 아래와 같이 로그가 찍히네요.

2019-05-14T12:39:02.664Z [express_server] info: Connection 8231 acquired
2019-05-14T12:39:02.667Z [express_server] debug: Execute query.

                SELECT * FROM CONTENTS WHERE 1=1

2019-05-14T12:39:02.679Z [express_server] info: Connection 8231 released

 

정상적으로 쿼리가 수행된걸 확인 할 수 있습니다.

 

반응형