summaryrefslogtreecommitdiff
path: root/lib/oracle-db/README.md
blob: ed59cf2e37e701aa220d544789e53883cd5df494 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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')
```