summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-05-21 10:04:19 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-05-21 10:04:19 +0000
commit11061af33d325546e075b37923845881ded0e6f6 (patch)
treea35951bc68a691f8cdd92af7ddc0efeaa70b8e31
parentd583c7912d9934e0550908b74a7eba8bdbb46953 (diff)
(김준회) Oracle DB 지원을 위한 라이브러리(oracledb, knex.js) 추가 및 번들러 버그 패치
-rw-r--r--.env.development16
-rw-r--r--.env.production12
-rw-r--r--lib/oracle-knex/README.md54
-rw-r--r--lib/oracle-knex/db.ts68
-rw-r--r--next.config.ts18
-rw-r--r--package-lock.json188
-rw-r--r--package.json2
7 files changed, 352 insertions, 6 deletions
diff --git a/.env.development b/.env.development
index 0ba6ec3d..0c97d071 100644
--- a/.env.development
+++ b/.env.development
@@ -11,9 +11,9 @@ Email_From_Address=dujin.kim@dtsolution.co.kr
NEXT_PUBLIC_MUI_KEY=da30586e1f20b93856a9783012fc9258Tz04ODI0MyxFPTE3NDQ0NTM2NzgwMDAsUz1wcmVtaXVtLExNPXN1YnNjcmlwdGlvbixLVj0y
- NEXT_PUBLIC_URL=http://3.36.56.124:3000
- NEXT_PUBLIC_BASE_URL=http://3.36.56.124:3001
- NEXTAUTH_URL=http://3.36.56.124:3000
+ NEXT_PUBLIC_URL=http://43.203.251.114:3000
+ NEXT_PUBLIC_BASE_URL=http://43.203.251.114:3001
+ NEXTAUTH_URL=http://43.203.251.114:3000
# PDFTRON KEYS
@@ -27,6 +27,14 @@ ERP_HEALTH_CHECK_URL=https://erp.example.com/api/health
SEDP_API_BASE_URL=http://sedpwebapi.ship.samsung.co.kr/dev/api
SEDP_API_USER_ID=EVCPUSER
-SEDP_API_PASSWORD=evcpuser@2025
+SEDP_API_PASSWORD=evcpusr@2025
+# Oracle DB 연결 설정 (개발용 - 로컬 컨테이너)
+ORACLE_USER=system
+ORACLE_PASSWORD=oracle
+ORACLE_CONNECTION_STRING=localhost:1521/XEPDB1
+# Oracle DB 연결 설정 (SHI 품질)
+# ORACLE_USER=shievcp
+# ORACLE_PASSWORD=evp_2025
+# ORACLE_CONNECTION_STRING=60.100.89.191:7971/SEVMQ \ No newline at end of file
diff --git a/.env.production b/.env.production
index 78447fac..0c4d3dd5 100644
--- a/.env.production
+++ b/.env.production
@@ -26,4 +26,14 @@ ERP_HEALTH_CHECK_URL=https://erp.example.com/api/health
SEDP_API_BASE_URL=http://sedpwebapi.ship.samsung.co.kr/api
SEDP_API_USER_ID=EVCPUSER
-SEDP_API_PASSWORD=evcpuser@2025
+SEDP_API_PASSWORD=evcpusr@2025
+
+# Oracle DB 연결 설정 (개발용 - 로컬 컨테이너)
+ORACLE_USER=system
+ORACLE_PASSWORD=oracle
+ORACLE_CONNECTION_STRING=localhost:1521/XEPDB1
+
+# Oracle DB 연결 설정 (SHI 품질)
+# ORACLE_USER=shievcp
+# ORACLE_PASSWORD=evp_2025
+# ORACLE_CONNECTION_STRING=60.100.89.191:7971/SEVMQ \ No newline at end of file
diff --git a/lib/oracle-knex/README.md b/lib/oracle-knex/README.md
new file mode 100644
index 00000000..fdff6e2f
--- /dev/null
+++ b/lib/oracle-knex/README.md
@@ -0,0 +1,54 @@
+# oracledb / knex.js 사용 방법
+
+1. oracledb로 SQL 직접 사용하기
+
+```ts
+ // Oracle DB 연결 설정
+ const connection = await oracledb.getConnection({
+ user: process.env.ORACLE_USER,
+ password: process.env.ORACLE_PASSWORD,
+ connectString: process.env.ORACLE_CONNECTION_STRING
+
+ });
+
+ // 쿼리 수행
+ const result = await connection.execute('SELECT 1 FROM DUAL');
+
+ // 연결 종료
+ await connection.close();
+```
+
+2. knex.js에서 SQL 직접 사용하기
+
+```ts
+export const oracleKnex = knex({
+ client: 'oracledb',
+ connection: {
+ user: process.env.ORACLE_USER,
+ password: process.env.ORACLE_PASSWORD,
+ connectString: process.env.ORACLE_CONNECTION_STRING,
+ },
+ pool: { min: 0, max: 5 }
+});
+
+sql = 'SELECT 1 FROM DUAL;'
+const result = await oracleKnex.raw(sql);
+```
+
+3. knex.js에서 쿼리빌더 사용하기
+```ts
+export const oracleKnex = knex({
+ client: 'oracledb',
+ connection: {
+ user: process.env.ORACLE_USER,
+ password: process.env.ORACLE_PASSWORD,
+ connectString: process.env.ORACLE_CONNECTION_STRING,
+ },
+ pool: { min: 0, max: 5 }
+});
+
+const result = await knex
+.qb
+.select('column1', 'column2', 'column3')
+.from('table_name')
+``` \ No newline at end of file
diff --git a/lib/oracle-knex/db.ts b/lib/oracle-knex/db.ts
new file mode 100644
index 00000000..fe61f0a2
--- /dev/null
+++ b/lib/oracle-knex/db.ts
@@ -0,0 +1,68 @@
+import knex from 'knex';
+// import oracledb from 'oracledb';
+const oracledb = require('oracledb');
+
+// Knex Oracle 연결 생성
+export const oracleKnex = knex({
+ client: 'oracledb',
+ connection: {
+ user: process.env.ORACLE_USER,
+ password: process.env.ORACLE_PASSWORD,
+ connectString: process.env.ORACLE_CONNECTION_STRING,
+ },
+ pool: { min: 0, max: 5 }
+});
+
+// OracleDB 직접 연결 생성 함수
+export async function getOracleConnection() {
+ try {
+ const connection = await oracledb.getConnection({
+ user: process.env.ORACLE_USER,
+ password: process.env.ORACLE_PASSWORD,
+ connectString: process.env.ORACLE_CONNECTION_STRING
+ });
+
+ return connection;
+ } catch (error) {
+ console.error('Oracle DB 연결 오류:', error);
+ throw error;
+ }
+}
+
+// 연결을 테스트하는 함수
+export async function testOracleConnection() {
+ try {
+ const connection = await getOracleConnection();
+ const result = await connection.execute('SELECT 1 FROM DUAL');
+ await connection.close();
+ return {
+ success: true,
+ message: 'Oracle DB 연결 성공',
+ data: result.rows
+ };
+ } catch (error: any) {
+ return {
+ success: false,
+ message: 'Oracle DB 연결 실패',
+ error: error instanceof Error ? error.message : '알 수 없는 오류'
+ };
+ }
+}
+
+// Knex를 사용하여 Oracle 연결 테스트
+export async function testKnexOracleConnection() {
+ try {
+ const result = await oracleKnex.raw('SELECT 1 FROM DUAL');
+ return {
+ success: true,
+ message: 'Knex Oracle DB 연결 성공',
+ data: result
+ };
+ } catch (error: any) {
+ return {
+ success: false,
+ message: 'Knex Oracle DB 연결 실패',
+ error: error instanceof Error ? error.message : '알 수 없는 오류'
+ };
+ }
+} \ No newline at end of file
diff --git a/next.config.ts b/next.config.ts
index 7508c10f..a87a0d79 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -19,7 +19,23 @@ const nextConfig: NextConfig = {
turbo: {
treeShaking: false,
minify: false,
- unstablePersistentCaching: false,
+ unstablePersistentCaching: false,
+ // [김준회 프로] 오라클 DB 사용을 위한 라이브러리/nextjs 번들러 호환 문제 해결
+ resolveAlias: {
+ '@azure/app-configuration': 'data:text/javascript,export default {};',
+ '@azure/identity': 'data:text/javascript,export default {};',
+ '@azure/keyvault-secrets': 'data:text/javascript,export default {};',
+ 'oci-common': 'data:text/javascript,export default {};',
+ 'oci-objectstorage': 'data:text/javascript,export default {};',
+ 'oci-secrets': 'data:text/javascript,export default {};',
+ // knex 관련 데이터베이스 드라이버들
+ 'better-sqlite3': 'data:text/javascript,export default {};',
+ 'mysql': 'data:text/javascript,export default {};',
+ 'mysql2': 'data:text/javascript,export default {};',
+ 'pg-query-stream': 'data:text/javascript,export default {};',
+ 'sqlite3': 'data:text/javascript,export default {};',
+ 'tedious': 'data:text/javascript,export default {};',
+ },
}
},
};
diff --git a/package-lock.json b/package-lock.json
index c6d28c8e..028a1953 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -78,6 +78,7 @@
"jotai": "^2.10.4",
"jsonwebtoken": "^9.0.2",
"jszip": "^3.10.1",
+ "knex": "^3.1.0",
"lucide-react": "^0.468.0",
"next": "15.1.0",
"next-auth": "^4.24.11",
@@ -86,6 +87,7 @@
"next-themes": "^0.4.4",
"nodemailer": "^6.9.16",
"nuqs": "^2.2.3",
+ "oracledb": "^6.8.0",
"pg": "^8.13.1",
"pino": "^9.5.0",
"pino-pretty": "^13.0.0",
@@ -7235,6 +7237,15 @@
"esbuild": ">=0.12 <1"
}
},
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escape-html": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
@@ -7644,6 +7655,15 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/espree": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
@@ -8381,6 +8401,15 @@
"node": ">=6"
}
},
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/get-symbol-description": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
@@ -8412,6 +8441,12 @@
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
}
},
+ "node_modules/getopts": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
+ "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==",
+ "license": "MIT"
+ },
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -8950,6 +8985,15 @@
"node": ">=12"
}
},
+ "node_modules/interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/ipaddr.js": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
@@ -9671,6 +9715,110 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/knex": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz",
+ "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "2.0.19",
+ "commander": "^10.0.0",
+ "debug": "4.3.4",
+ "escalade": "^3.1.1",
+ "esm": "^3.2.25",
+ "get-package-type": "^0.1.0",
+ "getopts": "2.3.0",
+ "interpret": "^2.2.0",
+ "lodash": "^4.17.21",
+ "pg-connection-string": "2.6.2",
+ "rechoir": "^0.8.0",
+ "resolve-from": "^5.0.0",
+ "tarn": "^3.0.2",
+ "tildify": "2.0.0"
+ },
+ "bin": {
+ "knex": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependenciesMeta": {
+ "better-sqlite3": {
+ "optional": true
+ },
+ "mysql": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "pg-native": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ },
+ "tedious": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/knex/node_modules/colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+ "license": "MIT"
+ },
+ "node_modules/knex/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/knex/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/knex/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "license": "MIT"
+ },
+ "node_modules/knex/node_modules/pg-connection-string": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
+ "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==",
+ "license": "MIT"
+ },
+ "node_modules/knex/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/language-subtag-registry": {
"version": "0.3.23",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
@@ -10796,6 +10944,16 @@
"node": ">=0.4.0"
}
},
+ "node_modules/oracledb": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/oracledb/-/oracledb-6.8.0.tgz",
+ "integrity": "sha512-A4ds4n4xtjPTzk1gwrHWuMeWsEcrScF0GFgVebGrhNpHSAzn6eDwMKcSbakZODKfFcI099iqhmqWsgko8D+7Ww==",
+ "hasInstallScript": true,
+ "license": "(Apache-2.0 OR UPL-1.0)",
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -11949,6 +12107,18 @@
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"license": "MIT"
},
+ "node_modules/rechoir": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve": "^1.20.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
"node_modules/reflect.getprototypeof": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz",
@@ -13231,6 +13401,15 @@
"node": ">=10"
}
},
+ "node_modules/tarn": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
+ "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -13261,6 +13440,15 @@
"real-require": "^0.2.0"
}
},
+ "node_modules/tildify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
+ "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/tiny-invariant": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
diff --git a/package.json b/package.json
index 71c39550..e423a76d 100644
--- a/package.json
+++ b/package.json
@@ -80,6 +80,7 @@
"jotai": "^2.10.4",
"jsonwebtoken": "^9.0.2",
"jszip": "^3.10.1",
+ "knex": "^3.1.0",
"lucide-react": "^0.468.0",
"next": "15.1.0",
"next-auth": "^4.24.11",
@@ -88,6 +89,7 @@
"next-themes": "^0.4.4",
"nodemailer": "^6.9.16",
"nuqs": "^2.2.3",
+ "oracledb": "^6.8.0",
"pg": "^8.13.1",
"pino": "^9.5.0",
"pino-pretty": "^13.0.0",