From 5921a845817a0c535fdecb64cba0dcc6e106861e Mon Sep 17 00:00:00 2001 From: hjjeong Date: Thu, 25 Sep 2025 14:25:18 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B0=B0=EC=B9=98=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20Oracle/MariaDB=20=EC=BB=A4?= =?UTF-8?q?=EB=84=A5=ED=84=B0=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20timestamp?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EB=B3=80=ED=99=98=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DatabaseConnectorFactory에 Oracle, MariaDB 커넥터 추가 - BatchService에서 PostgreSQL timestamp 타입 캐스팅 추가 - BatchExternalDbService에 쿼리 로깅 추가 - 배치 실행 로그 관련 타입 및 컨트롤러 개선 - 프론트엔드 배치 관리 UI 개선 --- .../batchExecutionLogController.ts | 1 + .../src/database/DatabaseConnectorFactory.ts | 8 ++++++++ .../src/routes/batchExecutionLogRoutes.ts | 1 + .../src/services/batchExternalDbService.ts | 3 +++ .../src/services/batchManagementService.ts | 1 + backend-node/src/services/batchService.ts | 19 ++++++++++++++++++- .../src/types/batchExecutionLogTypes.ts | 1 + backend-node/src/types/oracledb.d.ts | 1 + .../admin/batch-management-new/page.tsx | 1 + frontend/lib/api/batchManagement.ts | 1 + 10 files changed, 36 insertions(+), 1 deletion(-) diff --git a/backend-node/src/controllers/batchExecutionLogController.ts b/backend-node/src/controllers/batchExecutionLogController.ts index e0fbd0ef..68d8d880 100644 --- a/backend-node/src/controllers/batchExecutionLogController.ts +++ b/backend-node/src/controllers/batchExecutionLogController.ts @@ -176,3 +176,4 @@ export class BatchExecutionLogController { } } } + diff --git a/backend-node/src/database/DatabaseConnectorFactory.ts b/backend-node/src/database/DatabaseConnectorFactory.ts index 6bb55d88..f54c0e2e 100644 --- a/backend-node/src/database/DatabaseConnectorFactory.ts +++ b/backend-node/src/database/DatabaseConnectorFactory.ts @@ -1,5 +1,7 @@ import { DatabaseConnector, ConnectionConfig } from '../interfaces/DatabaseConnector'; import { PostgreSQLConnector } from './PostgreSQLConnector'; +import { OracleConnector } from './OracleConnector'; +import { MariaDBConnector } from './MariaDBConnector'; export class DatabaseConnectorFactory { private static connectors = new Map(); @@ -20,6 +22,12 @@ export class DatabaseConnectorFactory { case 'postgresql': connector = new PostgreSQLConnector(config); break; + case 'oracle': + connector = new OracleConnector(config); + break; + case 'mariadb': + connector = new MariaDBConnector(config); + break; // Add other database types here default: throw new Error(`지원하지 않는 데이터베이스 타입: ${type}`); diff --git a/backend-node/src/routes/batchExecutionLogRoutes.ts b/backend-node/src/routes/batchExecutionLogRoutes.ts index cc30c513..8f2dd9ec 100644 --- a/backend-node/src/routes/batchExecutionLogRoutes.ts +++ b/backend-node/src/routes/batchExecutionLogRoutes.ts @@ -44,3 +44,4 @@ router.get("/latest/:batchConfigId", authenticateToken, BatchExecutionLogControl router.get("/stats", authenticateToken, BatchExecutionLogController.getExecutionStats); export default router; + diff --git a/backend-node/src/services/batchExternalDbService.ts b/backend-node/src/services/batchExternalDbService.ts index ee9027fe..6fd4d006 100644 --- a/backend-node/src/services/batchExternalDbService.ts +++ b/backend-node/src/services/batchExternalDbService.ts @@ -660,6 +660,9 @@ export class BatchExternalDbService { query = `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${formattedValues})`; } + console.log(`[BatchExternalDbService] 실행할 쿼리: ${query}`); + console.log(`[BatchExternalDbService] 삽입할 데이터:`, record); + await connector.executeQuery(query); successCount++; } catch (error) { diff --git a/backend-node/src/services/batchManagementService.ts b/backend-node/src/services/batchManagementService.ts index 1d60c2fb..01b90743 100644 --- a/backend-node/src/services/batchManagementService.ts +++ b/backend-node/src/services/batchManagementService.ts @@ -368,3 +368,4 @@ export class BatchManagementService { } } } + diff --git a/backend-node/src/services/batchService.ts b/backend-node/src/services/batchService.ts index 99660af9..bfdac8ac 100644 --- a/backend-node/src/services/batchService.ts +++ b/backend-node/src/services/batchService.ts @@ -667,10 +667,27 @@ export class BatchService { if (dateRegex.test(value)) { return new Date(value).toISOString(); } + // ISO 날짜 문자열 형식 체크 (2025-09-24T06:29:01.351Z) + const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/; + if (isoDateRegex.test(value)) { + return new Date(value).toISOString(); + } } return value; }); - const placeholders = values.map((_, index) => `$${index + 1}`).join(', '); + + // PostgreSQL 타입 캐스팅을 위한 placeholder 생성 + const placeholders = columns.map((col, index) => { + // 날짜/시간 관련 컬럼명 패턴 체크 + if (col.toLowerCase().includes('date') || + col.toLowerCase().includes('time') || + col.toLowerCase().includes('created') || + col.toLowerCase().includes('updated') || + col.toLowerCase().includes('reg')) { + return `$${index + 1}::timestamp`; + } + return `$${index + 1}`; + }).join(', '); // Primary Key 컬럼 추정 (일반적으로 id 또는 첫 번째 컬럼) const primaryKeyColumn = columns.includes('id') ? 'id' : diff --git a/backend-node/src/types/batchExecutionLogTypes.ts b/backend-node/src/types/batchExecutionLogTypes.ts index 1f3ecff0..d966de7c 100644 --- a/backend-node/src/types/batchExecutionLogTypes.ts +++ b/backend-node/src/types/batchExecutionLogTypes.ts @@ -61,3 +61,4 @@ export interface BatchExecutionLogWithConfig extends BatchExecutionLog { is_active?: string | null; }; } + diff --git a/backend-node/src/types/oracledb.d.ts b/backend-node/src/types/oracledb.d.ts index 48974ff3..818b6a6f 100644 --- a/backend-node/src/types/oracledb.d.ts +++ b/backend-node/src/types/oracledb.d.ts @@ -15,3 +15,4 @@ declare module 'oracledb' { export function getPool(): any; export function close(): Promise; } + diff --git a/frontend/app/(main)/admin/batch-management-new/page.tsx b/frontend/app/(main)/admin/batch-management-new/page.tsx index 0e59cb46..47ed2b87 100644 --- a/frontend/app/(main)/admin/batch-management-new/page.tsx +++ b/frontend/app/(main)/admin/batch-management-new/page.tsx @@ -505,3 +505,4 @@ export default function BatchManagementNewPage() { ); } + diff --git a/frontend/lib/api/batchManagement.ts b/frontend/lib/api/batchManagement.ts index 044f1a65..ff0aa41f 100644 --- a/frontend/lib/api/batchManagement.ts +++ b/frontend/lib/api/batchManagement.ts @@ -111,3 +111,4 @@ export const BatchManagementAPI = { } } }; +