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 = { } } }; +