Connection Pool 개념

데이터베이스에 연결된 Connection을 미리 만들어 둔후 Pool에 보관하였다가 필요할 때 Pool에서 Connection을 가져다 사용한 후, 다시 Pool에 반환하는 기법입니다. Connection Pool을 이용하면 여러 Connection을 이용할 수 있기 때문에 더 큰 부하를 견딜 수 있습니다.

또한 기존처럼 필요할때 마다 Connection을 생성하고 닫지 않아도 되기 때문에 어플리케이션의 성능향상 또한 기대할 수 있습니다.

Connection Pool 생성

Node.js에서 Connection Pool은 아래와 같이 사용할 수 있습니다. Connection을 생성하지 않고 Pool을 생성한 후 getConnection()을 통해 가져다 사용해야 합니다.

Connection Pool 사용방법

mysql.createPool(_config) : 새로운 Pool 생성
pool.getConnection : pool에서 Connection 가져오

Pool을 위한 추가 설정

  • connectionLimit : 최대 컨넥션 개수 (default: 10)

아래의 옵션을 추가하여 최대 컨넥션의 개수를 지정할 수 있습니다.
git을 이용할 경우 아래와 같이 설정을 json파일로 빼고 .gitignore에 추가하는 것을 추천합니다.

db_config.json
1
2
3
4
5
6
7
{
"host": "<host>",
"user": "<username>",
"password": "<password>",
"database": "<database>",
"connectionLimit": 30
}
1
2
3
4
5
6
7
8
9
10
11
const mysql = require('mysql');
const config = require('./db_config.json');

var pool = mysql.createPool(config);
pool.getConnection(function(err, conn) {
if(!err) {
//연결 성공
conn.query(...);
}
conn.release();
});

위와 같이 Connection Pool을 생성할 수 있습니다. 그후 Pool에서 Connection을 얻어서 사용할 수 있습니다. 사용한 후 반드시 conn.release()를 통해 Pool에 반납해야 합니다.

Connection Pool 모듈화

db.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const mysql = require('mysql');
const config = require('./db_config.json');

let pool = mysql.createPool(config);

function getConnection(callback) {
pool.getConnection(function (err, conn) {
if(!err) {
callback(conn);
}
});
}

module.exports = getConnection;

getConnection() 함수를 exports하여 아래와 같이 필요한 곳에서 랩핑하여 쉽게 사용할 수 있습니다.

1
2
3
4
5
6
7
8
const getConnection = require('./db');

getConnection((conn) => {
conn.query(
...
);
conn.release();
});

사용후 꼭 conn.release()를 통해 PoolConnection을 반환해야 합니다.