diff options
| -rw-r--r-- | .env.development | 16 | ||||
| -rw-r--r-- | .env.production | 12 | ||||
| -rw-r--r-- | lib/oracle-knex/README.md | 54 | ||||
| -rw-r--r-- | lib/oracle-knex/db.ts | 68 | ||||
| -rw-r--r-- | next.config.ts | 18 | ||||
| -rw-r--r-- | package-lock.json | 188 | ||||
| -rw-r--r-- | package.json | 2 |
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", |
