Express에 MySql을 연동하는 방법입니다. 실행 환경은 Node > v10.16.2, Npm > 6.12.1 그리고 MySQL은 로컬이 아닌 리모트로 연결했습니다. 로컬에서 테스트를 원하면 MySQL Community Edition을 설치해야 합니다.

소스코드는 https://github.com/joseph77lee/node-express-mysql-pool에서 다운로드 가능합니다. (실행 전 model/db.js 파일의 db configuration을 설정해야 합니다.)

DB 설정

DB 만들기
CREATE DATABASE mydb;
Table 만들기
CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL,
  `task` varchar(200) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);
 
ALTER TABLE `tasks` ADD PRIMARY KEY (`id`);
ALTER TABLE `tasks` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Sample data 생성
INSERT INTO `tasks` (`id`, `task`, `status`, `created_at`) VALUES
(1, 'Find bugs', 1, '2016-04-10 23:50:40'),
(2, 'Review code', 1, '2016-04-10 23:50:40'),
(3, 'Fix bugs', 1, '2016-04-10 23:50:40'),
(4, 'Refactor Code', 1, '2016-04-10 23:50:40'),
(5, 'Push to prod', 1, '2016-04-10 23:50:50');

MySQL Pool 사용하기

동시에 여러 요청을 수용하기 위해 MySQL Connection Pool을 사용했습니다. 캐쉬된 Connection 재사용으로 동시에 여러 요청 처리가 가능합니다.

mysql.createPool(db_config)로 Connection Pool 생성합니다. getConnection은 connection을 생성하고 callback함수로 넘겨줍니다.

'user strict';

var mysql = require('mysql');

//mysql db connection config
var db_config = {
  host: 'DB 호스트 이름',
  port: 'DB 포트 넘버',
  database: 'DB 이름',
  user: '유저 이름',
  password: '암호'
};

var pool = mysql.createPool(db_config);

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

module.exports = getConnection;

실제 사용하는 예제입니다. sql 함수에 callback함수를 넘겨 connection을 사용합니다. 사용 후에는 connection.release()로 다시 Pool에 넣어줍니다.

var sql = require('./db.js');
.
.
Task.getAllTask = function(result) {
  sql((err, connection) => {
    if (err) {
      console.log('connection error', error);
      result(err, null);
    }
    connection.query('Select * from tasks', function(e, res) {
      if (e) {
        console.log('error: ', e);
        result(e, null);
      } else {
        console.log('tasks : ', res);

        result(null, res);
      }
    });
    connection.release();
  });
};
.
.

siege로 부하 테스트 결과

siege -t1M http://localhost:3000/tasks/2

Lifting the server siege...
Transactions:		        2241 hits
Availability:		      100.00 %
Elapsed time:		       36.17 secs
Data transferred:	        0.00 MB
Response time:		        0.16 secs
Transaction rate:	       61.96 trans/sec
Throughput:		        0.00 MB/sec
Concurrency:		        9.65
Successful transactions:        2241
Failed transactions:	           0
Longest transaction:	        0.61
Shortest transaction:	        0.13

댓글 남기기