개요
node에서 oracle client를 연동하기 위해서는 node-oracledb 라는 라이브러리가 필요하다. 이 글에서는 라이브러리 설치 및 환경변수 설정, 노드 백엔드에서의 간단한 연동법을 소개한다.
설치 및 환경변수 설정
💡 실행 환경 : linux arm64, m1 mac
- 다운로드
- 아래 링크에서 Basic Light Package (ZIP)을 내려받는다
https://www.oracle.com/database/technologies/instant-client/linux-arm-aarch64-downloads.html
instantclient-basiclite-linux.arm64-19.10.0.0.0dbru (1).zip
- opt/oracle 폴더로 이동하여 압축해제
cd ~/../../opt/
/opt/oracle/instantclient_19_8 과 같이 라이브러리가 위치하도록한다.
- bash_profile 수정
DYLD_LIBRARY_PATH=/opt/oracle
(리눅스는 LD_LIBRARY_PATH)
- 백엔드 실행 시 아래와 같은 오류가 없다면 정상적으로 연동된 것이다. 오류가 난다면 환경변수의 경로가 옳게 설정되었는지 다시 확인해본다.
Error: DPI-1047: Cannot locate a 64-bit Oracle Client library
사용법
- 초기화 (라이브러리 경로 : libDir 을 확인)
const oracledb = require('oracledb');
const os = require('os');
switch (os.type().toLowerCase()) {
case 'windows_nt':
oracledb.initOracleClient({libDir: 'C:/EXTERNAL_LIBRARY/instantclient_21_8'});
break;
case 'darwin':
oracledb.initOracleClient({libDir: '/opt/oracle/instantclient_19_8'});
break;
case 'linux':
oracledb.initOracleClient({libDir: '/opt/oracle/instantclient_21_9'});
break;
}
// 쿼리 아웃풋을 객체로 받을지 배열로 받을지 옵션 설정 (배열의 경우엔 .OUT_FORMAT_ARRAY)
oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT;
class Oracle {
constructor() {
}
// 접속 초기화
async init() {
const _this = this;
return new Promise((resolve, reject) => {
oracledb.getConnection({
user: process.env.ORACLE_USER,
password: process.env.ORACLE_PASS,
connectString: process.env.ORACLE_HOST
}, function (error, connection) {
if (error) {
return reject(error);
}
_this.connection = connection;
return resolve();
});
});
}
// 쿼리 실행
execute(sql, params = []) {
const _this = this;
return new Promise((resolve, reject) => {
_this.connection.execute(sql, params, function (error, result) {
if (error) {
return reject(error);
}
return resolve(result.rows);
});
});
}
// 쿼리 커밋
commit() {
const _this = this;
return new Promise((resolve, reject) => {
if (_this.connection) {
_this.connection.commit(error => {
_this.release();
if (error) {
return reject(error);
}
return resolve();
});
} else {
return resolve();
}
});
}
// 롤백
rollback() {
const _this = this;
return new Promise((resolve, reject) => {
if (_this.connection) {
_this.connection.rollback(error => {
_this.release();
if (error) {
return reject(error);
}
return resolve();
});
} else {
return resolve();
}
});
}
// 접속 해제 (commit, rollback시 반드시 수행)
release() {
this.connection.release();
}
}
- 노드 백엔드의 객체 초기화 및 쿼리 실행 예제
const oracledb = new Oracle();
await oracledb.init();
( ... )
try {
const [max_no] = await oracledb.execute(`SELECT MAX("NO") AS value FROM INTF_JJ.INTF_ES_ORDER WHERE REQ_DT = TO_CHAR(SYSDATE, 'YYYYMMDD')`);
await oracledb.commit();
} catch (e) {
await oracledb.rollback();
return next(e);
}
참고
http://oracle.github.io/node-oracledb/