// Oracle Autonomous DB 접속 (node-oracledb thick 모드). // Instant Client + sso 지갑(cwallet.sso)을 사용하므로 지갑 비밀번호가 필요 없다. // (백엔드 JDBC 와 동일하게 자동로그인 지갑을 재사용) import oracledb from 'oracledb'; import { config } from './config.js'; import { log } from './logger.js'; oracledb.fetchAsString = [oracledb.CLOB]; oracledb.autoCommit = false; let pool = null; let clientInitialized = false; function initClient() { if (clientInitialized) return; oracledb.initOracleClient({ libDir: config.oracle.icLibDir, configDir: config.oracle.netConfigDir, // tnsnames.ora + WALLET_LOCATION 보정 sqlnet.ora }); clientInitialized = true; } export async function initPool() { if (pool) return pool; initClient(); pool = await oracledb.createPool({ user: config.oracle.user, password: config.oracle.password, connectString: config.oracle.connectString, poolMin: 1, poolMax: 4, poolIncrement: 1, }); log.info('Oracle 풀 생성 완료'); return pool; } export async function withConnection(fn) { if (!pool) await initPool(); const conn = await pool.getConnection(); try { return await fn(conn); } finally { try { await conn.close(); } catch (e) { log.warn('연결 반환 실패:', e.message); } } } export async function closePool() { if (pool) { await pool.close(10); pool = null; log.info('Oracle 풀 종료'); } } export { oracledb };