1. 환경소개
- OS
- CentOS7 64비트
- Node.js
- 10.15.3 버전
- Npm
- 6.4.1 버전
- java
- 1.8.0_201 버전
- Editer
- Eclipse
- DB
- CUBRID 10.1 (10.1.2.7694-64632b2)(64비트)
2. 커넥션 풀 (Connection Pool) 이란?
2-1) 개념
● 데이터베이스와 연결된 커넥션을 미리 만들어서 풀(pool) 속에 저장해 두고 있다가 필요할 때 커넥션을 풀에서 쓰고 다시 풀에 반환하는 기법을 말합니다.
● 커넥션 풀을 사용하면 커넥션을 생성하고 닫는 시간이 소모되지 않기 때문에 애플리케이션의 실행 속도가 빨라지며,
또한 한 번에 생성될 수 있는 커넥션 수를 제어하기 때문에 동시 접속자 수가 몰려도 웹 애플리케이션이 쉽게 다운되지 않습니다.
● 웹 컨테이너가 실행되면 커넥션(Connection) 객체를 미리 풀(pool)에 생성해 둡니다.
● DB와 연결된 커넥션(Connection)을 미리 생성하고, 풀(pool) 속에 저장했다가 필요할 때에 가져다 쓰고 반환합니다.
● 미리 커넥션(Connection)을 생성했기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리할 수 있습니다.
3. 커넥션 풀 (Connection Pool) 환경 설정
● node-cubrid는 자체적인 커넥션 풀(Connection Pool) 기능을 제공하고 있지는 않습니다.
● generic-pool 모듈을 설치해야 합니다.
- 모듈 사이트 : https://www.npmjs.com/package/generic-pool
3-1) generic-pool 설치
● npm install genetic-pool --save
3-2) generic-pool 설치 확인
4. Node.js에서 Connection Pool 사용 방법
* 클라이언트에게 보이는 View는 2탄에서 설명한 test_view.ejs을 사용하고, 라우터 test.js만 수정한 것입니다.
4-1) 예제 코드
test.js |
const CUBRID = require('node-cubrid'); // node-cubrid 모듈 불러오기 const dbConf = { // DB 정보 설정 const opts = { // 풀 자원 설정 const pool = genericPool.createPool(factory,opts); // Pool 생성 router.get('/', function(req, res) { // get 형식으로 '/' URL로 들어갈 경우 /views/test/test_view.ejs 뷰를 보여준다. router.get('/test_view', function(req,res,next){ // select 쿼리 pool.release(client); // 사용 한 커넥션을 풀에 반납하는 함수 입니다. |
*Node.js에서 커넥션 풀(Connection Pool) 설정에 중요 코드는 빨간색으로 체크했습니다.
4-2) 예제 결과
<Node서버 결과>
<CUBRID Broker 상태 확인>
<test_view.ejs 결과>
4-3) factory object 설정 요소
● name
- pool 이름
● create 함수
- 새로운 자원을 반환하는 기능으로 생성된 리소스를 콜백으로 호출한다.
● destory 함수
- 승인된 자원을 삭제한다.
● max
- 주어진 시간에 만들 수 있는 자원의 최대 수 (기본값 1)
● min
- 풀을 유지하는 최소한의 자원. max보다 높게 설정하면 max -1이 자동으로 설정된다. (기본값 0)
● refreshidle
- idleTimeoutMillis 이후 삭제된 자원이 재 작성되어야 하는지 여부 (기본값 true)
● idletimeoutMillis
- 리소스가 생존할 수 있는 최대 시간 (기본값 30000)
● reapIntervalMillis
- 유휴자원을 확인하는 시간 (기본값 1000)
● returnToHead
- boolean, 큐의 동작 방법, true일 경우 가장 최신의 큐가 먼저 실행된다. (기본값 false)
● priorityRange
- 1과 임의의 수 x 사이. 임의의 리소스를 사용할 수 없을 경우 큐에 상대적인 우순 순위를 저정 할 수 있다.
● validate
- 자원 객체가 유효한지 여부 확인.
- return ture 일 경우 풀링된 자원을 허용.
- flase 일 경우 자원을 삭제한다.
- 이 기능은 풀 자원을 반환하기 전 acquire() 에서 호출된다.
● log
- true: 정보가 console.log에 전송된다.
- false(기본값): 메세지는 무시된다.
4-4) Pool info
● pool.getName(); // pool factory.name 반환
● pool.getPoolSize() // pool 에서 사용중인 자원과 남은 자원 수를 반환
● pool.availableObjectsCount() // pool에서 사용되지 않는 자원 수를 반환
● pool.waitingClientsCount() // 취득(acquire)된 자원의 대기 수를 반환
● pool.getMaxPoolSize() // 허용된 최대 자원 수를 반환
* 마지막 4탄에서는 Node.js에서 커넥션풀(Connection Pool)을 이용해 큐브리드와 연동하는 방법을 소개하고, Node.js 사용자들을 위한 CUBIRD 연동 방법을 마칩니다.
* 1탄~4탄을 작성하며, Node.js의 개념을 요약하였지만 중요한 부분을 빠트리거나, 궁금하신 점 댓글에 남겨주시면 최대한 공부하여 답변드리겠습니다.
긴 글을 읽어주셔서 감사합니다.
수정하여 pull request 요청은 넣었지만
merge 전까지 관련해서 내용 수정해주시면 좋을 듯 합니다.