diff options
| -rw-r--r-- | lib/oracle-db/README.md | 134 | ||||
| -rw-r--r-- | lib/oracle-db/db.ts (renamed from lib/oracle-knex/db.ts) | 5 | ||||
| -rw-r--r-- | lib/oracle-knex/README.md | 54 | ||||
| -rw-r--r-- | next.config.ts | 20 |
4 files changed, 157 insertions, 56 deletions
diff --git a/lib/oracle-db/README.md b/lib/oracle-db/README.md new file mode 100644 index 00000000..ed59cf2e --- /dev/null +++ b/lib/oracle-db/README.md @@ -0,0 +1,134 @@ +# oracledb / knex.js + +필요로 하는 oracle DB Select 대상이 있어 작성. + +## 주의점 + +1. 클라이언트 사이드에서 직접 호출할 수 없음 +2. js require 는 필요한 것만 가져와야 하는데, webpack이나 turbopack이 이를 지원하지 않음. + +- oracledb 및 knex에서 사용하지 않는 의존성들은 무시해야 하는데, 항상 번들링하려고 함. +- 없는 의존성을 번들링하려고 하니 문제가 발생함. + +### 문제1 해결하기 + +client 컴포넌트에서 oracledb / knex.js 라이브러리를 직접 사용하는 경우, fs 등 node 에 포함된 서버 라이브러리를 처리할 수 없음. +서버측 함수를 클라측에서 호출하는 문제이므로 여러 해결 방법이 있음. 권장되는 방식은 서버 액션으로 분리하는 것임. + +1. (추천) 서버 액션으로 분리하기 +2. API 호출로 분리하기 +3. 커스텀 훅 만들어서 서버측 사이클 만들기 + +### 문제2 해결하기 + +[관련 깃허브 이슈](https://github.com/oracle/node-oracledb/issues/1691) + +next.js 설정을 변경해야 함. +사용하지 않는 의존성들에 대해서는 resolveAlias를 추가해 에러를 던지지 않도록 처리하면 됨. + +참고: + +```ts +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + webpack: (config) => { + // turbo의 resolveAlias와 동일한 설정을 webpack에 적용 + config.resolve.alias = { + ...config.resolve.alias, + '@azure/app-configuration': false, + '@azure/identity': false, + '@azure/keyvault-secrets': false, + 'oci-common': false, + 'oci-objectstorage': false, + 'oci-secrets': false, + // knex 관련 데이터베이스 드라이버들 + 'better-sqlite3': false, + 'mysql': false, + 'mysql2': false, + 'pg-query-stream': false, + 'sqlite3': false, + 'tedious': false, + }; + + return config; + }, + experimental: { + turbo: { + 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 {};', + }, + } + }, +}; + +export default nextConfig; +``` + +## 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') +``` diff --git a/lib/oracle-knex/db.ts b/lib/oracle-db/db.ts index fe61f0a2..62321df0 100644 --- a/lib/oracle-knex/db.ts +++ b/lib/oracle-db/db.ts @@ -1,5 +1,6 @@ import knex from 'knex'; // import oracledb from 'oracledb'; +// eslint-disable-next-line @typescript-eslint/no-require-imports const oracledb = require('oracledb'); // Knex Oracle 연결 생성 @@ -40,7 +41,7 @@ export async function testOracleConnection() { message: 'Oracle DB 연결 성공', data: result.rows }; - } catch (error: any) { + } catch (error: unknown) { return { success: false, message: 'Oracle DB 연결 실패', @@ -58,7 +59,7 @@ export async function testKnexOracleConnection() { message: 'Knex Oracle DB 연결 성공', data: result }; - } catch (error: any) { + } catch (error: unknown) { return { success: false, message: 'Knex Oracle DB 연결 실패', diff --git a/lib/oracle-knex/README.md b/lib/oracle-knex/README.md deleted file mode 100644 index fdff6e2f..00000000 --- a/lib/oracle-knex/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# 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/next.config.ts b/next.config.ts index a87a0d79..9bc5785e 100644 --- a/next.config.ts +++ b/next.config.ts @@ -10,6 +10,26 @@ const nextConfig: NextConfig = { typescript: { ignoreBuildErrors: true, }, + webpack: (config) => { + // turbo의 resolveAlias와 동일한 설정을 webpack에 적용 + config.resolve.alias = { + ...config.resolve.alias, + '@azure/app-configuration': false, + '@azure/identity': false, + '@azure/keyvault-secrets': false, + 'oci-common': false, + 'oci-objectstorage': false, + 'oci-secrets': false, + 'better-sqlite3': false, + 'mysql': false, + 'mysql2': false, + 'pg-query-stream': false, + 'sqlite3': false, + 'tedious': false, + }; + + return config; + }, experimental: { serverActions: { // [김준회 프로] DRM 복호화/암호화 백엔드로 보낼 때 사이즈 제한 변경(기본값: 1MB) |
