본문 바로가기

SCRIPT/NODE JS

[nodejs] JDBC 모듈 : <node-jdbc>

[nodejs] JDBC 모듈 :< node-jdbc >



자바스크립트 언어를 사용하는 nodejs에서는 NPM 에서 다양한 모듈을 제공(오픈라이브러리)받을 수 있습니다.

대표적인 라이브러리들은 이미 만들어져 제공되어있기때문에, nodejs는 다양한 레퍼런스를 제공받을 수있기 때문에 

많은 방면으로 개발이 용이합니다.






그 중에서 오늘 JDBC 모듈에 대한 포스팅을 해보겠습니다.

우선, JDBC (Java Database Connectivity) 란 '자바에서 DB에 접속하기 위한 자바 API' 라고 할 수 있겠습니다.

그리고 JDBC 에서는 데이터베이스에서 SELECT , UPDATE, DELETE 등의 쿼리를 처리하는 역활을 합니다.





그리고, 우리가 사용할 데이터베이스 제공 사이트로부터 JDBC 드라이버를 제공(다운로드)받아서, JDBC에 붙여서 사용하기만 하면 되는 것 입니다.

JDBC 드라이버를 읽고 처리하는 역활은 JDBC 에서 할 것이며, 우리는 JDBC에 접속 URL 과 Config 설정만 해준다면, DB에 접속해서 필요한 

(Selct, update, delete 등의 일련의 쿼리) 처리 명령만하면 사용할 수 있다는 이야기 입니다.




이번 포스팅은 하둡위에서 실행되는 아파치 임팔라 쿼리 엔진의 JDBC에 접근하고, 사용하는 포스팅을 해볼까합니다.

* 이외의 node-impala 라는 NPM 모듈이 존재합니다만, node-impala 의 경우에는 보안 인증에 대한 기능이 제공되지 않기 때문에, 제가 필요한 모듈이 

아닌 관계로 사용하지 않습니다. 상황과 필요에 따라 아래 node-impala 라는 모듈을 사용해보시는 것도 나쁘지 않을 것입니다. IP와 포트넘버만을 가지고 

IMPALA DEAMON 에 접속하여 DATA를 가져올 수 있기 때문이죠. (node-impala URL : https://www.npmjs.com/package/node-impala ) 







1. NODE-JDBC

우선, nodejs 에서 사용할 JDBC 모듈이 필요합니다. NPM 사이트에서 'jdbc' 를 검색하시던지, URL을 이용하여 jdbc를 참고 해 봅시다.

node-jdbc url 은 [ https://www.npmjs.com/package/jdbc ] 입니다. 


설명에는 node.js 용 JDBC API 라는 간단명료한 설명으로 이 모듈의 모든 것을 명시해두었군요.

작성일 기준으로 현재 0.6.3 버전까지 나와있습니다.  적정 JDK 버전은 1.8 이며, JAVA 9버전은 지원하지 않는 상태입니다.

자세한 설명 및 공식 예제가 필요하신분은 위의 URL 을 참조하면 될 것 같습니다.


사실 jdbc 모듈을 사용하실 상황이라면, nodejs 에 사용에 대한 모든 기본세팅이 되어 있을 것으로 판단되기 때문에 간단히 작성하도록 하겠습니다.

1. JDK 설치 1.8 버전 이상 (https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html)

 + 환경변수 설정 ( JAVA_HOME , CLAAS_PATH , PATH )

 + JAVA -version , JAVAC -version 체크

 * 2가지 이상 버전설치 시 

 + regedit 에서 Current Version 1.8 로 변경

 + windows32 에서 java.exe, javaw.exe, javaws.exe 파일 삭제( 옮겨두던지 )


2. node 이클립스 설치 

 방법1. 이클립스 + workspace 마켓 


3. Visual basic 설치

 + node-jdbc 를 사용하기 위해서는 비쥬얼 베이직 필요


위의 과정이 완료되어 있다면, 아래의 설치 방법을 통하여, 설치를 진행해보도록 하겠습니다.


2. 모듈 설치


설치방법은 Windows 기준이며, 리눅스의 경우 CMD를 터미널로 이해하시고 진행하시면 될 것 같습니다.



CMD 를 관리자 모드로 실행. 

( Linux 계열의 경우 'su' 로 진행 ) 


> npm install -g node-gyp

-- 진행 완료 후,

> npm install -g --add-python-to-path --production windows-build-tools

-- 진행 완료 후,

> npm config set msvs_version 2015

-- 진행 완료 후,

> npm install -g jdbc

JDBC 모듈 설치가 완료 되었습니다.



3. JDBC 드라이버 


이제, 접근할 DB의 드라이버를 다운받아 보도록 합시다.

IMPALA JDBC 드라이버 설치 :  https://www.cloudera.com/downloads/connectors/impala/jdbc/2-5-5.html

Imapal JDBC 드라이버를 다운 받도록 합시다.

필요한 버전과 OS 선택은 필요에 따라 적절히 선택하여, 다운로드 받도록합니다.


4. JDBC Conifg  

이제 JDBC 환경설정을 한 후, 실제로 사용해 보도록 합시다.


jdbc.js    

var _ = require('lodash');
var nodeunit = require('nodeunit');
var jinst = require('../lib/jinst');
var Pool = require('../lib/pool');
 
if (!jinst.isJvmCreated()) {
  jinst.addOption("-Xrs");
  jinst.setupClasspath(['./drivers/hsqldb.jar',
                        './drivers/derby.jar',
                        './drivers/derbyclient.jar',
                        './drivers/derbytools.jar']);
}
 
var config = {
  url: 'jdbc:hsqldb:hsql://localhost/xdb',
  user : 'SA',
  password: '',
  minpoolsize: 2,
  maxpoolsize: 3
};
 
var testpool = null;
var testconn = null;
 
module.exports = {
  setUp: function(callback) {
    if (testpool === null) {
      testpool = new Pool(config);
    }
    callback();
  },
  testinitialize: function(test) {
    // Initialize the pool (create minpoolsize connections)
    testpool.initialize(function(err) {
      test.expect(1);
      test.equal(null, err);
      test.done();
    });
  },
  testreserve: function(test) {
    // Reserve a connection.
    testpool.reserve(function(err, conn) {
      test.expect(4);
      test.equal(null, err);
      test.ok(conn && typeof conn == 'object');
      test.equal(testpool._pool.length, 1);
      test.equal(testpool._reserved.length, 1);
      testconn = conn;
      test.done();
    });
  },
  testrelease: function(test) {
    // Release a connection.
    testpool.release(testconn, function(err, conn) {
      test.expect(3);
      test.equal(null, err);
      test.equal(testpool._pool.length, 2);
      test.equal(testpool._reserved.length, 0);
      testconn = null;
      test.done();
    });
  },
  testreserverelease: function(test) {
    // Reserve then release a connection.
    testpool.reserve(function(err, conn) {
      if (err) {
        console.log(err);
      } else {
        testpool.release(conn, function(err) {
          test.expect(3);
          test.equal(null, err);
          test.equal(testpool._pool.length, 2);
          test.equal(testpool._reserved.length, 0);
          test.done();
        });
      }
    });
  },
  testreservepastmin: function(test) {
    // Reserve connections past minpoolsize.  This will grow the pool.
    var conns = [];
    for(= 0; i < 3; i++) {
      testpool.reserve(function(err, conn) {
        conns.push(conn);
        if (== 3) {
          test.expect(2);
          test.equal(testpool._pool.length, 0);
          test.equal(testpool._reserved.length, 3);
          _.each(conns, function(conn) {
            testpool.release(conn, function(err) {});
          });
          test.done();
        }
      });
    }
  },
  testovermax: function(test) {
    // Reserve connections past maxpoolsize.  This will max out the pool, and
    // throw an error when the last reserve request is made.
    var conns = [];
    for(= 0; i < 4; i++) {
      testpool.reserve(function(err, conn) {
        if (err) {
          if (== 3) {
            test.expect(3);
            test.ok(err);
            test.equal(testpool._reserved.length, 3);
            test.equal(testpool._pool.length, 0);
            _.each(conns, function(conn) {
              testpool.release(conn, function(err) {});
            });
            test.done();
          } else {
            console.log(err);
          }
        } else {
          conns.push(conn);
        }
      });
    }
  }
};