@simplysm/orm-node 14.0.49 → 14.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -29
- package/dist/connections/mssql-db-conn.js.map +1 -1
- package/dist/connections/mysql-db-conn.js.map +1 -1
- package/dist/node-db-context-executor.js.map +1 -1
- package/docs/connections/mssql-db-conn.md +78 -0
- package/docs/connections/mysql-db-conn.md +76 -0
- package/docs/connections/postgresql-db-conn.md +79 -0
- package/docs/core/create-db-conn.md +54 -0
- package/docs/core/create-orm.md +100 -0
- package/docs/core/node-db-context-executor.md +45 -0
- package/docs/types/db-conn-config.md +91 -0
- package/docs/types/db-conn-constants.md +33 -0
- package/docs/types/db-conn.md +55 -0
- package/docs/types/get-dialect-from-config.md +17 -0
- package/package.json +3 -3
- package/src/connections/mssql-db-conn.ts +1 -1
- package/src/connections/mysql-db-conn.ts +1 -1
- package/src/node-db-context-executor.ts +1 -1
- package/docs/connections.md +0 -137
- package/docs/core.md +0 -131
- package/docs/types.md +0 -173
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# DbConnConfig
|
|
2
|
+
|
|
3
|
+
DB 연결 설정 discriminated union. `dialect` 필드로 구현체를 분기한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConfig;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Related Types
|
|
10
|
+
|
|
11
|
+
### `MysqlDbConnConfig`
|
|
12
|
+
|
|
13
|
+
MySQL 연결 설정.
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
interface MysqlDbConnConfig {
|
|
17
|
+
dialect: "mysql";
|
|
18
|
+
host: string;
|
|
19
|
+
port?: number;
|
|
20
|
+
username: string;
|
|
21
|
+
password: string;
|
|
22
|
+
database?: string;
|
|
23
|
+
defaultIsolationLevel?: IsolationLevel;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
| Field | Type | Description |
|
|
28
|
+
|-------|------|-------------|
|
|
29
|
+
| `dialect` | `"mysql"` | Discriminant. 항상 `"mysql"` |
|
|
30
|
+
| `host` | `string` | 호스트 주소 |
|
|
31
|
+
| `port` | `number?` | 포트 (생략 시 mysql2 기본값 사용) |
|
|
32
|
+
| `username` | `string` | 사용자 이름 |
|
|
33
|
+
| `password` | `string` | 비밀번호 |
|
|
34
|
+
| `database` | `string?` | 데이터베이스 이름 |
|
|
35
|
+
| `defaultIsolationLevel` | `IsolationLevel?` | 기본 격리 수준 (미지정 시 `READ_UNCOMMITTED`) |
|
|
36
|
+
|
|
37
|
+
### `MssqlDbConnConfig`
|
|
38
|
+
|
|
39
|
+
MSSQL/Azure SQL 연결 설정.
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
interface MssqlDbConnConfig {
|
|
43
|
+
dialect: "mssql" | "mssql-azure";
|
|
44
|
+
host: string;
|
|
45
|
+
port?: number;
|
|
46
|
+
username: string;
|
|
47
|
+
password: string;
|
|
48
|
+
database?: string;
|
|
49
|
+
schema?: string;
|
|
50
|
+
defaultIsolationLevel?: IsolationLevel;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Field | Type | Description |
|
|
55
|
+
|-------|------|-------------|
|
|
56
|
+
| `dialect` | `"mssql" \| "mssql-azure"` | Discriminant. `"mssql-azure"`인 경우 암호화 연결(`encrypt: true`)을 사용한다 |
|
|
57
|
+
| `host` | `string` | 호스트 주소 |
|
|
58
|
+
| `port` | `number?` | 포트 |
|
|
59
|
+
| `username` | `string` | 사용자 이름 |
|
|
60
|
+
| `password` | `string` | 비밀번호 |
|
|
61
|
+
| `database` | `string?` | 데이터베이스 이름 |
|
|
62
|
+
| `schema` | `string?` | 스키마 이름 |
|
|
63
|
+
| `defaultIsolationLevel` | `IsolationLevel?` | 기본 격리 수준 (미지정 시 `READ_UNCOMMITTED`) |
|
|
64
|
+
|
|
65
|
+
### `PostgresqlDbConnConfig`
|
|
66
|
+
|
|
67
|
+
PostgreSQL 연결 설정.
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
interface PostgresqlDbConnConfig {
|
|
71
|
+
dialect: "postgresql";
|
|
72
|
+
host: string;
|
|
73
|
+
port?: number;
|
|
74
|
+
username: string;
|
|
75
|
+
password: string;
|
|
76
|
+
database?: string;
|
|
77
|
+
schema?: string;
|
|
78
|
+
defaultIsolationLevel?: IsolationLevel;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
| Field | Type | Description |
|
|
83
|
+
|-------|------|-------------|
|
|
84
|
+
| `dialect` | `"postgresql"` | Discriminant. 항상 `"postgresql"` |
|
|
85
|
+
| `host` | `string` | 호스트 주소 |
|
|
86
|
+
| `port` | `number?` | 포트 (미지정 시 `5432`) |
|
|
87
|
+
| `username` | `string` | 사용자 이름 |
|
|
88
|
+
| `password` | `string` | 비밀번호 |
|
|
89
|
+
| `database` | `string?` | 데이터베이스 이름 |
|
|
90
|
+
| `schema` | `string?` | 스키마 이름 |
|
|
91
|
+
| `defaultIsolationLevel` | `IsolationLevel?` | 기본 격리 수준 (미지정 시 `READ_UNCOMMITTED`) |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# DB_CONN_CONNECT_TIMEOUT
|
|
2
|
+
|
|
3
|
+
DB 연결 수립 타임아웃 (10초).
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
const DB_CONN_CONNECT_TIMEOUT = 10 * 1000; // 10_000ms
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Related Types
|
|
10
|
+
|
|
11
|
+
### `DB_CONN_DEFAULT_TIMEOUT`
|
|
12
|
+
|
|
13
|
+
DB 쿼리 기본 타임아웃 (10분). 유휴 연결 자동 종료 타이머는 이 값의 2배 후 `close()`를 호출한다.
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
const DB_CONN_DEFAULT_TIMEOUT = 10 * 60 * 1000; // 600_000ms
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### `DB_CONN_ERRORS`
|
|
20
|
+
|
|
21
|
+
DB 연결 관련 오류 메시지 상수.
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
const DB_CONN_ERRORS = {
|
|
25
|
+
NOT_CONNECTED: "'Connection'이 연결되어 있지 않습니다.",
|
|
26
|
+
ALREADY_CONNECTED: "'Connection'이 이미 연결되어 있습니다.",
|
|
27
|
+
} as const;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Key | Value |
|
|
31
|
+
|-----|-------|
|
|
32
|
+
| `NOT_CONNECTED` | `"'Connection'이 연결되어 있지 않습니다."` |
|
|
33
|
+
| `ALREADY_CONNECTED` | `"'Connection'이 이미 연결되어 있습니다."` |
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# DbConn
|
|
2
|
+
|
|
3
|
+
저수준 DB 연결 인터페이스. 각 DBMS 구현체(`MssqlDbConn`, `MysqlDbConn`, `PostgresqlDbConn`)가 이 인터페이스를 구현한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
interface DbConn extends EventEmitter<{ close: void }> {
|
|
7
|
+
config: DbConnConfig;
|
|
8
|
+
isConnected: boolean;
|
|
9
|
+
isInTransaction: boolean;
|
|
10
|
+
connect(): Promise<void>;
|
|
11
|
+
close(): Promise<void>;
|
|
12
|
+
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
13
|
+
commitTransaction(): Promise<void>;
|
|
14
|
+
rollbackTransaction(): Promise<void>;
|
|
15
|
+
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
16
|
+
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
17
|
+
bulkInsert(
|
|
18
|
+
tableName: string,
|
|
19
|
+
columnMetas: Record<string, ColumnMeta>,
|
|
20
|
+
records: Record<string, unknown>[],
|
|
21
|
+
): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Members
|
|
26
|
+
|
|
27
|
+
| Member | Kind | Type | Description |
|
|
28
|
+
|--------|------|------|-------------|
|
|
29
|
+
| `config` | property | `DbConnConfig` | 연결 설정 |
|
|
30
|
+
| `isConnected` | property | `boolean` | 연결 여부 |
|
|
31
|
+
| `isInTransaction` | property | `boolean` | 트랜잭션 진행 여부 |
|
|
32
|
+
| `connect()` | method | `Promise<void>` | DB 연결을 수립한다 |
|
|
33
|
+
| `close()` | method | `Promise<void>` | DB 연결을 종료한다 |
|
|
34
|
+
| `beginTransaction(isolationLevel?)` | method | `Promise<void>` | 트랜잭션을 시작한다 |
|
|
35
|
+
| `commitTransaction()` | method | `Promise<void>` | 트랜잭션을 커밋한다 |
|
|
36
|
+
| `rollbackTransaction()` | method | `Promise<void>` | 트랜잭션을 롤백한다 |
|
|
37
|
+
| `execute(queries)` | method | `Promise<Record<string, unknown>[][]>` | SQL 쿼리 배열을 실행한다 |
|
|
38
|
+
| `executeParametrized(query, params?)` | method | `Promise<Record<string, unknown>[][]>` | 파라미터화된 쿼리를 실행한다 |
|
|
39
|
+
| `bulkInsert(tableName, columnMetas, records)` | method | `Promise<void>` | 네이티브 bulk API를 사용하여 대량 삽입한다 |
|
|
40
|
+
|
|
41
|
+
`EventEmitter<{ close: void }>`를 상속하므로 연결 종료 시 `'close'` 이벤트를 수신할 수 있다.
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
conn.on("close", () => {
|
|
47
|
+
// 연결이 종료됨
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
await conn.connect();
|
|
51
|
+
await conn.beginTransaction();
|
|
52
|
+
await conn.execute(["INSERT INTO users (name) VALUES ('Alice')"]);
|
|
53
|
+
await conn.commitTransaction();
|
|
54
|
+
await conn.close();
|
|
55
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# getDialectFromConfig
|
|
2
|
+
|
|
3
|
+
`DbConnConfig`에서 정규화된 `Dialect`를 추출한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
function getDialectFromConfig(config: DbConnConfig): Dialect;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Parameters
|
|
10
|
+
|
|
11
|
+
| Param | Type | Description |
|
|
12
|
+
|-------|------|-------------|
|
|
13
|
+
| `config` | `DbConnConfig` | DB 연결 설정 |
|
|
14
|
+
|
|
15
|
+
## Returns
|
|
16
|
+
|
|
17
|
+
`Dialect` — 정규화된 dialect 값. `"mssql-azure"` → `"mssql"`로 변환하고, 나머지(`"mysql"`, `"mssql"`, `"postgresql"`)는 `config.dialect`를 그대로 반환한다.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/orm-node",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.50",
|
|
4
4
|
"description": "심플리즘 패키지 - ORM (node)",
|
|
5
5
|
"author": "심플리즘",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"consola": "^3.4.2",
|
|
23
|
-
"@simplysm/core-common": "14.0.
|
|
24
|
-
"@simplysm/orm-common": "14.0.
|
|
23
|
+
"@simplysm/core-common": "14.0.50",
|
|
24
|
+
"@simplysm/orm-common": "14.0.50"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/pg": "^8.20.0",
|
|
@@ -68,7 +68,7 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
68
68
|
requestTimeout: this._timeout,
|
|
69
69
|
trustServerCertificate: true,
|
|
70
70
|
connectTimeout: DB_CONN_CONNECT_TIMEOUT,
|
|
71
|
-
}
|
|
71
|
+
},
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
conn.on("infoMessage", (info) => {
|
|
@@ -142,7 +142,7 @@ export class MysqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
142
142
|
const [queryResults] = await conn.query({
|
|
143
143
|
sql: query,
|
|
144
144
|
timeout: this._timeout,
|
|
145
|
-
values: params
|
|
145
|
+
values: params,
|
|
146
146
|
});
|
|
147
147
|
|
|
148
148
|
this._startTimeout();
|
|
@@ -132,7 +132,7 @@ export class NodeDbContextExecutor implements DbContextExecutor {
|
|
|
132
132
|
if (resultMetas != null && resultMetas.every((item) => item == null)) {
|
|
133
133
|
const combinedSql = defs.map((def) => builder.build(def).sql).join("\n");
|
|
134
134
|
await conn.execute([combinedSql]);
|
|
135
|
-
return defs.map(() => [])
|
|
135
|
+
return defs.map(() => []);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
// 각 def를 개별적으로 실행
|
package/docs/connections.md
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
# Connections
|
|
2
|
-
|
|
3
|
-
세 연결 클래스(`MssqlDbConn`, `MysqlDbConn`, `PostgresqlDbConn`)는 모두 `EventEmitter<{ close: void }>`를 상속하고 `DbConn` 인터페이스를 구현한다.
|
|
4
|
-
|
|
5
|
-
일반적으로 직접 생성하지 않고 `createDbConn()`을 통해 인스턴스를 얻는다. 직접 생성은 테스트 코드에서 네이티브 라이브러리를 주입할 때 사용한다.
|
|
6
|
-
|
|
7
|
-
## `MssqlDbConn`
|
|
8
|
-
|
|
9
|
-
tedious 라이브러리를 사용하여 MSSQL/Azure SQL 연결을 관리하는 클래스.
|
|
10
|
-
|
|
11
|
-
```typescript
|
|
12
|
-
class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn {
|
|
13
|
-
isConnected: boolean;
|
|
14
|
-
isInTransaction: boolean;
|
|
15
|
-
readonly config: MssqlDbConnConfig;
|
|
16
|
-
|
|
17
|
-
constructor(
|
|
18
|
-
tedious: typeof import("tedious"),
|
|
19
|
-
config: MssqlDbConnConfig,
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
connect(): Promise<void>;
|
|
23
|
-
close(): Promise<void>;
|
|
24
|
-
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
25
|
-
commitTransaction(): Promise<void>;
|
|
26
|
-
rollbackTransaction(): Promise<void>;
|
|
27
|
-
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
28
|
-
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
29
|
-
bulkInsert(
|
|
30
|
-
tableName: string,
|
|
31
|
-
columnMetas: Record<string, ColumnMeta>,
|
|
32
|
-
records: Record<string, unknown>[],
|
|
33
|
-
): Promise<void>;
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**생성자**: tedious 라이브러리 모듈을 첫 번째 인수로 직접 주입받는다. `createDbConn()`이 동적 import 후 전달한다.
|
|
38
|
-
|
|
39
|
-
**`connect()`**: `config.dialect === "mssql-azure"`인 경우 `encrypt: true`로 연결한다. 연결 성공 시 유휴 타임아웃 타이머(`DB_CONN_DEFAULT_TIMEOUT * 2`)를 시작한다.
|
|
40
|
-
|
|
41
|
-
**`close()`**: 진행 중인 요청을 취소(`cancel()`)하고 30초 내에 완료될 때까지 대기한 뒤 연결을 종료한다.
|
|
42
|
-
|
|
43
|
-
**`bulkInsert()`**: tedious `BulkLoad` API를 사용한다. 값 변환 규칙:
|
|
44
|
-
- `Uuid` → `toString()`
|
|
45
|
-
- `Uint8Array` → `Buffer.from(val)` (tedious 라이브러리 요구사항으로 인한 예외적 허용)
|
|
46
|
-
- `DateTime` / `DateOnly` → `.date` (native Date 객체)
|
|
47
|
-
- `Time` → `"HH:mm:ss"` 포맷 문자열
|
|
48
|
-
|
|
49
|
-
**`executeParametrized()`**: 파라미터가 있으면 `conn.execSql()`, 없으면 `conn.execSqlBatch()`를 사용한다. 쿼리 오류 시 오류 발생 줄을 `==> ` 접두사로 표시하여 에러 메시지에 포함한다.
|
|
50
|
-
|
|
51
|
-
## `MysqlDbConn`
|
|
52
|
-
|
|
53
|
-
mysql2/promise 라이브러리를 사용하여 MySQL 연결을 관리하는 클래스.
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
class MysqlDbConn extends EventEmitter<{ close: void }> implements DbConn {
|
|
57
|
-
isConnected: boolean;
|
|
58
|
-
isInTransaction: boolean;
|
|
59
|
-
readonly config: MysqlDbConnConfig;
|
|
60
|
-
|
|
61
|
-
constructor(
|
|
62
|
-
mysql2: typeof import("mysql2/promise"),
|
|
63
|
-
config: MysqlDbConnConfig,
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
connect(): Promise<void>;
|
|
67
|
-
close(): Promise<void>;
|
|
68
|
-
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
69
|
-
commitTransaction(): Promise<void>;
|
|
70
|
-
rollbackTransaction(): Promise<void>;
|
|
71
|
-
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
72
|
-
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
73
|
-
bulkInsert(
|
|
74
|
-
tableName: string,
|
|
75
|
-
columnMetas: Record<string, ColumnMeta>,
|
|
76
|
-
records: Record<string, unknown>[],
|
|
77
|
-
): Promise<void>;
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**생성자**: mysql2/promise 라이브러리 모듈을 첫 번째 인수로 직접 주입받는다.
|
|
82
|
-
|
|
83
|
-
**`connect()`**: `username === "root"`인 경우 `database` 옵션을 전달하지 않는다 (모든 데이터베이스에 접근 가능하도록 관리 작업용). `multipleStatements: true`, `charset: "utf8mb4"`로 연결한다.
|
|
84
|
-
|
|
85
|
-
**`beginTransaction()`**: `SET SESSION TRANSACTION ISOLATION LEVEL {level}` 후 `BEGIN`을 실행한다. MySQL은 트랜잭션 시작 전에 격리 수준을 설정해야 한다.
|
|
86
|
-
|
|
87
|
-
**`bulkInsert()`**: `LOAD DATA LOCAL INFILE`을 사용한다. 처리 흐름:
|
|
88
|
-
1. `os.tmpdir()`에 UUID 기반 임시 CSV 파일 생성 (TAB 구분)
|
|
89
|
-
2. UUID/binary 컬럼은 hex 문자열로 기록, `SET` 절에서 `UNHEX()` 변환
|
|
90
|
-
3. `LOAD DATA LOCAL INFILE` 실행
|
|
91
|
-
4. `finally` 블록에서 임시 파일 삭제
|
|
92
|
-
|
|
93
|
-
**`executeParametrized()`**: 결과 형식에 따라 처리:
|
|
94
|
-
- single SELECT → flat `RowDataPacket[]`를 단일 결과 집합으로 반환
|
|
95
|
-
- single INSERT/UPDATE/DELETE → `ResultSetHeader`이므로 빈 결과 집합 반환
|
|
96
|
-
- multi-statement → 각 statement의 결과를 별도 결과 집합으로 분리
|
|
97
|
-
|
|
98
|
-
## `PostgresqlDbConn`
|
|
99
|
-
|
|
100
|
-
pg + pg-copy-streams 라이브러리를 사용하여 PostgreSQL 연결을 관리하는 클래스.
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
class PostgresqlDbConn extends EventEmitter<{ close: void }> implements DbConn {
|
|
104
|
-
isConnected: boolean;
|
|
105
|
-
isInTransaction: boolean;
|
|
106
|
-
readonly config: PostgresqlDbConnConfig;
|
|
107
|
-
|
|
108
|
-
constructor(
|
|
109
|
-
pg: typeof import("pg"),
|
|
110
|
-
pgCopyStreams: typeof import("pg-copy-streams"),
|
|
111
|
-
config: PostgresqlDbConnConfig,
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
connect(): Promise<void>;
|
|
115
|
-
close(): Promise<void>;
|
|
116
|
-
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
117
|
-
commitTransaction(): Promise<void>;
|
|
118
|
-
rollbackTransaction(): Promise<void>;
|
|
119
|
-
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
120
|
-
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
121
|
-
bulkInsert(
|
|
122
|
-
tableName: string,
|
|
123
|
-
columnMetas: Record<string, ColumnMeta>,
|
|
124
|
-
records: Record<string, unknown>[],
|
|
125
|
-
): Promise<void>;
|
|
126
|
-
}
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**생성자**: pg와 pg-copy-streams 라이브러리 모듈을 첫 번째, 두 번째 인수로 직접 주입받는다.
|
|
130
|
-
|
|
131
|
-
**`connect()`**: 기본 포트는 `5432`. `connectionTimeoutMillis: DB_CONN_CONNECT_TIMEOUT`, `query_timeout: DB_CONN_DEFAULT_TIMEOUT`으로 연결한다.
|
|
132
|
-
|
|
133
|
-
**`beginTransaction()`**: `BEGIN` 후 `SET TRANSACTION ISOLATION LEVEL {level}`을 실행한다.
|
|
134
|
-
|
|
135
|
-
**`bulkInsert()`**: `COPY FROM STDIN`(CSV 형식)을 사용한다. `pg-copy-streams`의 `from()` 함수로 스트림을 생성하고, `Readable.from(csvContent)`를 파이프한다. binary 컬럼은 PostgreSQL bytea hex 형식(`\x{hex}`)으로 변환한다.
|
|
136
|
-
|
|
137
|
-
**`executeParametrized()`**: PostgreSQL은 단일 결과 집합을 반환하므로 `[result.rows]`로 래핑하여 반환한다.
|
package/docs/core.md
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# Core
|
|
2
|
-
|
|
3
|
-
## `createDbConn`
|
|
4
|
-
|
|
5
|
-
dialect 기반 DbConn 팩토리. 네이티브 드라이버를 지연 로딩하여 DbConn 인스턴스를 생성한다.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
async function createDbConn(config: DbConnConfig): Promise<DbConn>;
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
`config.dialect`에 따라 적절한 DbConn 구현체를 생성한다:
|
|
12
|
-
|
|
13
|
-
| dialect | 반환 타입 | 로드하는 패키지 |
|
|
14
|
-
|---------|-----------|----------------|
|
|
15
|
-
| `"mysql"` | `MysqlDbConn` | `mysql2/promise` |
|
|
16
|
-
| `"postgresql"` | `PostgresqlDbConn` | `pg`, `pg-copy-streams` |
|
|
17
|
-
| `"mssql"` / `"mssql-azure"` | `MssqlDbConn` | `tedious` |
|
|
18
|
-
|
|
19
|
-
네이티브 드라이버 패키지는 최초 호출 시에만 동적 import로 로드하고 모듈 수준 캐시에 보관한다. 이후 호출에서는 캐시된 모듈을 재사용한다.
|
|
20
|
-
|
|
21
|
-
반환된 `DbConn`은 아직 연결되지 않은 상태이므로 `connect()`를 별도로 호출해야 한다.
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
const conn = await createDbConn({ dialect: "mysql", host: "...", username: "...", password: "..." });
|
|
25
|
-
await conn.connect(); // 연결 수립
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## `NodeDbContextExecutor`
|
|
29
|
-
|
|
30
|
-
`orm-common`의 `DbContextExecutor` 인터페이스를 구현하는 Node.js 환경용 실행자. `DbContext`에서 내부적으로 사용한다.
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
class NodeDbContextExecutor implements DbContextExecutor {
|
|
34
|
-
constructor(config: DbConnConfig);
|
|
35
|
-
|
|
36
|
-
connect(): Promise<void>;
|
|
37
|
-
close(): Promise<void>;
|
|
38
|
-
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
39
|
-
commitTransaction(): Promise<void>;
|
|
40
|
-
rollbackTransaction(): Promise<void>;
|
|
41
|
-
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
42
|
-
bulkInsert(
|
|
43
|
-
tableName: string,
|
|
44
|
-
columnMetas: Record<string, ColumnMeta>,
|
|
45
|
-
records: DataRecord[],
|
|
46
|
-
): Promise<void>;
|
|
47
|
-
executeDefs<T = DataRecord>(
|
|
48
|
-
defs: QueryDef[],
|
|
49
|
-
resultMetas?: (ResultMeta | undefined)[],
|
|
50
|
-
): Promise<T[][]>;
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
내부적으로 `createDbConn()`으로 DB 연결을 생성하고 관리한다.
|
|
55
|
-
|
|
56
|
-
**`executeDefs()`**: `QueryDef` 배열을 SQL로 변환하여 실행한다. 처리 방식:
|
|
57
|
-
- `resultMetas`가 모두 `undefined`이면 쿼리를 단일 문자열로 결합하여 한 번의 요청으로 실행한다 (결과 불필요 최적화).
|
|
58
|
-
- 그 외에는 각 def를 개별 실행하고 `ResultMeta`가 있으면 `parseQueryResult()`로 결과를 파싱한다.
|
|
59
|
-
- `buildResult.resultSetIndex`가 지정된 경우 해당 인덱스의 결과 집합을 사용한다.
|
|
60
|
-
|
|
61
|
-
일반적으로 직접 사용하지 않는다. `createOrm()`이 내부적으로 이 클래스를 생성하여 `DbContext`에 전달한다.
|
|
62
|
-
|
|
63
|
-
## `createOrm`
|
|
64
|
-
|
|
65
|
-
Node.js ORM 팩토리 함수. `DbContext` 서브클래스와 DB 연결 설정을 받아 트랜잭션을 관리하는 `Orm<T>` 인스턴스를 반환한다.
|
|
66
|
-
|
|
67
|
-
```typescript
|
|
68
|
-
function createOrm<T extends DbContext>(
|
|
69
|
-
DbClass: new (executor: DbContextExecutor, opt: { database: string; schema?: string }) => T,
|
|
70
|
-
config: DbConnConfig,
|
|
71
|
-
options?: OrmOptions,
|
|
72
|
-
): Orm<T>;
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
`options.database` / `options.schema`는 `config`의 동일 필드보다 우선 적용된다. `database`는 필수이며, `config`와 `options` 양쪽 모두 `database`가 없으면 에러를 throw한다.
|
|
76
|
-
|
|
77
|
-
```typescript
|
|
78
|
-
class MyDb extends DbContext {
|
|
79
|
-
user = this.queryable(User);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const orm = createOrm(MyDb, {
|
|
83
|
-
dialect: "mysql",
|
|
84
|
-
host: "localhost",
|
|
85
|
-
username: "root",
|
|
86
|
-
password: "password",
|
|
87
|
-
database: "mydb",
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
await orm.connect(async (db) => {
|
|
91
|
-
return db.user().execute();
|
|
92
|
-
});
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## `Orm`
|
|
96
|
-
|
|
97
|
-
`createOrm()`에서 반환하는 객체의 타입.
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
interface Orm<T extends DbContext> {
|
|
101
|
-
readonly DbClass: new (executor: DbContextExecutor, opt: { database: string; schema?: string }) => T;
|
|
102
|
-
readonly config: DbConnConfig;
|
|
103
|
-
readonly options?: OrmOptions;
|
|
104
|
-
connect<R>(callback: (conn: T) => Promise<R>, isolationLevel?: IsolationLevel): Promise<R>;
|
|
105
|
-
connectWithoutTransaction<R>(callback: (conn: T) => Promise<R>): Promise<R>;
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
| Field | Type | Description |
|
|
110
|
-
|-------|------|-------------|
|
|
111
|
-
| `DbClass` | constructor | DbContext 서브클래스 생성자 |
|
|
112
|
-
| `config` | `DbConnConfig` | DB 연결 설정 |
|
|
113
|
-
| `options` | `OrmOptions?` | ORM 옵션 |
|
|
114
|
-
| `connect(callback, isolationLevel?)` | `Promise<R>` | 트랜잭션 내에서 콜백을 실행한다. 콜백 완료 후 자동 커밋, 예외 발생 시 자동 롤백 |
|
|
115
|
-
| `connectWithoutTransaction(callback)` | `Promise<R>` | 트랜잭션 없이 콜백을 실행한다 |
|
|
116
|
-
|
|
117
|
-
## `OrmOptions`
|
|
118
|
-
|
|
119
|
-
`createOrm()`의 세 번째 인수로 전달하는 옵션. `DbConnConfig`의 동일 필드보다 우선 적용된다.
|
|
120
|
-
|
|
121
|
-
```typescript
|
|
122
|
-
interface OrmOptions {
|
|
123
|
-
database?: string;
|
|
124
|
-
schema?: string;
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
| Field | Type | Description |
|
|
129
|
-
|-------|------|-------------|
|
|
130
|
-
| `database` | `string?` | 데이터베이스 이름. `DbConnConfig`의 `database` 대신 사용된다 |
|
|
131
|
-
| `schema` | `string?` | 스키마 이름 (MSSQL: `dbo`, PostgreSQL: `public`). `DbConnConfig`의 `schema` 대신 사용된다 |
|
package/docs/types.md
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
# Types
|
|
2
|
-
|
|
3
|
-
## `DbConn`
|
|
4
|
-
|
|
5
|
-
저수준 DB 연결 인터페이스. 각 DBMS 구현체(`MssqlDbConn`, `MysqlDbConn`, `PostgresqlDbConn`)가 이 인터페이스를 구현한다.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
interface DbConn extends EventEmitter<{ close: void }> {
|
|
9
|
-
config: DbConnConfig;
|
|
10
|
-
isConnected: boolean;
|
|
11
|
-
isInTransaction: boolean;
|
|
12
|
-
connect(): Promise<void>;
|
|
13
|
-
close(): Promise<void>;
|
|
14
|
-
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
15
|
-
commitTransaction(): Promise<void>;
|
|
16
|
-
rollbackTransaction(): Promise<void>;
|
|
17
|
-
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
18
|
-
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
19
|
-
bulkInsert(
|
|
20
|
-
tableName: string,
|
|
21
|
-
columnMetas: Record<string, ColumnMeta>,
|
|
22
|
-
records: Record<string, unknown>[],
|
|
23
|
-
): Promise<void>;
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
| Field | Type | Description |
|
|
28
|
-
|-------|------|-------------|
|
|
29
|
-
| `config` | `DbConnConfig` | 연결 설정 |
|
|
30
|
-
| `isConnected` | `boolean` | 연결 여부 |
|
|
31
|
-
| `isInTransaction` | `boolean` | 트랜잭션 진행 여부 |
|
|
32
|
-
| `connect()` | `Promise<void>` | DB 연결을 수립한다 |
|
|
33
|
-
| `close()` | `Promise<void>` | DB 연결을 종료한다 |
|
|
34
|
-
| `beginTransaction(isolationLevel?)` | `Promise<void>` | 트랜잭션을 시작한다 |
|
|
35
|
-
| `commitTransaction()` | `Promise<void>` | 트랜잭션을 커밋한다 |
|
|
36
|
-
| `rollbackTransaction()` | `Promise<void>` | 트랜잭션을 롤백한다 |
|
|
37
|
-
| `execute(queries)` | `Promise<Record<string, unknown>[][]>` | SQL 쿼리 배열을 실행한다 |
|
|
38
|
-
| `executeParametrized(query, params?)` | `Promise<Record<string, unknown>[][]>` | 파라미터화된 쿼리를 실행한다 |
|
|
39
|
-
| `bulkInsert(tableName, columnMetas, records)` | `Promise<void>` | 네이티브 bulk API를 사용하여 대량 삽입한다 |
|
|
40
|
-
|
|
41
|
-
`EventEmitter<{ close: void }>`를 상속하므로 연결 종료 시 `'close'` 이벤트를 수신할 수 있다.
|
|
42
|
-
|
|
43
|
-
## `DbConnConfig`
|
|
44
|
-
|
|
45
|
-
DB 연결 설정 discriminated union. `dialect` 필드로 구현체를 분기한다.
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConfig;
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## `MysqlDbConnConfig`
|
|
52
|
-
|
|
53
|
-
MySQL 연결 설정.
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
interface MysqlDbConnConfig {
|
|
57
|
-
dialect: "mysql";
|
|
58
|
-
host: string;
|
|
59
|
-
port?: number;
|
|
60
|
-
username: string;
|
|
61
|
-
password: string;
|
|
62
|
-
database?: string;
|
|
63
|
-
defaultIsolationLevel?: IsolationLevel;
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
| Field | Type | Description |
|
|
68
|
-
|-------|------|-------------|
|
|
69
|
-
| `dialect` | `"mysql"` | Discriminant. 항상 `"mysql"` |
|
|
70
|
-
| `host` | `string` | 호스트 주소 |
|
|
71
|
-
| `port` | `number?` | 포트 (생략 시 mysql2 기본값 사용) |
|
|
72
|
-
| `username` | `string` | 사용자 이름 |
|
|
73
|
-
| `password` | `string` | 비밀번호 |
|
|
74
|
-
| `database` | `string?` | 데이터베이스 이름 |
|
|
75
|
-
| `defaultIsolationLevel` | `IsolationLevel?` | 기본 격리 수준 (미지정 시 `READ_UNCOMMITTED`) |
|
|
76
|
-
|
|
77
|
-
## `MssqlDbConnConfig`
|
|
78
|
-
|
|
79
|
-
MSSQL/Azure SQL 연결 설정.
|
|
80
|
-
|
|
81
|
-
```typescript
|
|
82
|
-
interface MssqlDbConnConfig {
|
|
83
|
-
dialect: "mssql" | "mssql-azure";
|
|
84
|
-
host: string;
|
|
85
|
-
port?: number;
|
|
86
|
-
username: string;
|
|
87
|
-
password: string;
|
|
88
|
-
database?: string;
|
|
89
|
-
schema?: string;
|
|
90
|
-
defaultIsolationLevel?: IsolationLevel;
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
| Field | Type | Description |
|
|
95
|
-
|-------|------|-------------|
|
|
96
|
-
| `dialect` | `"mssql" \| "mssql-azure"` | Discriminant. `"mssql-azure"`인 경우 암호화 연결(encrypt)을 사용한다 |
|
|
97
|
-
| `host` | `string` | 호스트 주소 |
|
|
98
|
-
| `port` | `number?` | 포트 |
|
|
99
|
-
| `username` | `string` | 사용자 이름 |
|
|
100
|
-
| `password` | `string` | 비밀번호 |
|
|
101
|
-
| `database` | `string?` | 데이터베이스 이름 |
|
|
102
|
-
| `schema` | `string?` | 스키마 이름 |
|
|
103
|
-
| `defaultIsolationLevel` | `IsolationLevel?` | 기본 격리 수준 (미지정 시 `READ_UNCOMMITTED`) |
|
|
104
|
-
|
|
105
|
-
## `PostgresqlDbConnConfig`
|
|
106
|
-
|
|
107
|
-
PostgreSQL 연결 설정.
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
interface PostgresqlDbConnConfig {
|
|
111
|
-
dialect: "postgresql";
|
|
112
|
-
host: string;
|
|
113
|
-
port?: number;
|
|
114
|
-
username: string;
|
|
115
|
-
password: string;
|
|
116
|
-
database?: string;
|
|
117
|
-
schema?: string;
|
|
118
|
-
defaultIsolationLevel?: IsolationLevel;
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
| Field | Type | Description |
|
|
123
|
-
|-------|------|-------------|
|
|
124
|
-
| `dialect` | `"postgresql"` | Discriminant. 항상 `"postgresql"` |
|
|
125
|
-
| `host` | `string` | 호스트 주소 |
|
|
126
|
-
| `port` | `number?` | 포트 (미지정 시 `5432`) |
|
|
127
|
-
| `username` | `string` | 사용자 이름 |
|
|
128
|
-
| `password` | `string` | 비밀번호 |
|
|
129
|
-
| `database` | `string?` | 데이터베이스 이름 |
|
|
130
|
-
| `schema` | `string?` | 스키마 이름 |
|
|
131
|
-
| `defaultIsolationLevel` | `IsolationLevel?` | 기본 격리 수준 (미지정 시 `READ_UNCOMMITTED`) |
|
|
132
|
-
|
|
133
|
-
## `DB_CONN_CONNECT_TIMEOUT`
|
|
134
|
-
|
|
135
|
-
DB 연결 수립 타임아웃 (10초).
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
const DB_CONN_CONNECT_TIMEOUT = 10 * 1000; // 10_000ms
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## `DB_CONN_DEFAULT_TIMEOUT`
|
|
142
|
-
|
|
143
|
-
DB 쿼리 기본 타임아웃 (10분). 유휴 연결 자동 종료 타이머는 이 값의 2배 후 `close()`를 호출한다.
|
|
144
|
-
|
|
145
|
-
```typescript
|
|
146
|
-
const DB_CONN_DEFAULT_TIMEOUT = 10 * 60 * 1000; // 600_000ms
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## `DB_CONN_ERRORS`
|
|
150
|
-
|
|
151
|
-
DB 연결 관련 오류 메시지 상수.
|
|
152
|
-
|
|
153
|
-
```typescript
|
|
154
|
-
const DB_CONN_ERRORS = {
|
|
155
|
-
NOT_CONNECTED: "'Connection'이 연결되어 있지 않습니다.",
|
|
156
|
-
ALREADY_CONNECTED: "'Connection'이 이미 연결되어 있습니다.",
|
|
157
|
-
} as const;
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
| Key | Value |
|
|
161
|
-
|-----|-------|
|
|
162
|
-
| `NOT_CONNECTED` | `"'Connection'이 연결되어 있지 않습니다."` |
|
|
163
|
-
| `ALREADY_CONNECTED` | `"'Connection'이 이미 연결되어 있습니다."` |
|
|
164
|
-
|
|
165
|
-
## `getDialectFromConfig`
|
|
166
|
-
|
|
167
|
-
`DbConnConfig`에서 정규화된 `Dialect`를 추출한다.
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
function getDialectFromConfig(config: DbConnConfig): Dialect;
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
`"mssql-azure"` → `"mssql"`로 변환하고, 나머지(`"mysql"`, `"mssql"`, `"postgresql"`)는 `config.dialect`를 그대로 반환한다.
|