Merge branch 'feature/rest-api-integration' of http://39.117.244.52:3000/kjs/ERP-node

This commit is contained in:
2025-09-26 20:04:07 +09:00
40 changed files with 10345 additions and 1914 deletions

View File

@@ -1,10 +1,7 @@
import {
DatabaseConnector,
ConnectionConfig,
QueryResult,
} from "../interfaces/DatabaseConnector";
import { ConnectionTestResult, TableInfo } from "../types/externalDbTypes";
import * as mysql from "mysql2/promise";
import { DatabaseConnector, ConnectionConfig, QueryResult } from '../interfaces/DatabaseConnector';
import { ConnectionTestResult, TableInfo } from '../types/externalDbTypes';
// @ts-ignore
import * as mysql from 'mysql2/promise';
export class MariaDBConnector implements DatabaseConnector {
private connection: mysql.Connection | null = null;
@@ -22,18 +19,8 @@ export class MariaDBConnector implements DatabaseConnector {
user: this.config.user,
password: this.config.password,
database: this.config.database,
// 🔧 MySQL2에서 지원하는 타임아웃 설정
connectTimeout: this.config.connectionTimeoutMillis || 30000, // 연결 타임아웃 30초
ssl: typeof this.config.ssl === "boolean" ? undefined : this.config.ssl,
// 🔧 MySQL2에서 지원하는 추가 설정
charset: "utf8mb4",
timezone: "Z",
supportBigNumbers: true,
bigNumberStrings: true,
// 🔧 연결 풀 설정 (단일 연결이지만 안정성을 위해)
dateStrings: true,
debug: false,
trace: false,
connectTimeout: this.config.connectionTimeoutMillis,
ssl: typeof this.config.ssl === 'boolean' ? undefined : this.config.ssl,
});
}
}
@@ -49,9 +36,7 @@ export class MariaDBConnector implements DatabaseConnector {
const startTime = Date.now();
try {
await this.connect();
const [rows] = await this.connection!.query(
"SELECT VERSION() as version"
);
const [rows] = await this.connection!.query("SELECT VERSION() as version");
const version = (rows as any[])[0]?.version || "Unknown";
const responseTime = Date.now() - startTime;
await this.disconnect();
@@ -79,18 +64,7 @@ export class MariaDBConnector implements DatabaseConnector {
async executeQuery(query: string): Promise<QueryResult> {
try {
await this.connect();
// 🔧 쿼리 타임아웃 수동 구현 (60초)
const queryTimeout = this.config.queryTimeoutMillis || 60000;
const queryPromise = this.connection!.query(query);
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error("쿼리 실행 타임아웃")), queryTimeout);
});
const [rows, fields] = (await Promise.race([
queryPromise,
timeoutPromise,
])) as any;
const [rows, fields] = await this.connection!.query(query);
await this.disconnect();
return {
rows: rows as any[],
@@ -133,54 +107,28 @@ export class MariaDBConnector implements DatabaseConnector {
async getColumns(tableName: string): Promise<any[]> {
try {
console.log(`🔍 MariaDB 컬럼 조회 시작: ${tableName}`);
console.log(`[MariaDBConnector] getColumns 호출: tableName=${tableName}`);
await this.connect();
// 🔧 컬럼 조회 타임아웃 수동 구현 (30초)
const queryTimeout = this.config.queryTimeoutMillis || 30000;
// 스키마명을 명시적으로 확인
const schemaQuery = `SELECT DATABASE() as schema_name`;
const [schemaResult] = await this.connection!.query(schemaQuery);
const schemaName =
(schemaResult as any[])[0]?.schema_name || this.config.database;
console.log(`📋 사용할 스키마: ${schemaName}`);
const query = `
console.log(`[MariaDBConnector] 연결 완료, 쿼리 실행 시작`);
const [rows] = await this.connection!.query(`
SELECT
COLUMN_NAME as column_name,
DATA_TYPE as data_type,
IS_NULLABLE as is_nullable,
COLUMN_DEFAULT as column_default,
COLUMN_COMMENT as column_comment
COLUMN_DEFAULT as column_default
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION;
`;
console.log(
`📋 실행할 쿼리: ${query.trim()}, 파라미터: [${schemaName}, ${tableName}]`
);
const queryPromise = this.connection!.query(query, [
schemaName,
tableName,
]);
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error("컬럼 조회 타임아웃")), queryTimeout);
});
const [rows] = (await Promise.race([
queryPromise,
timeoutPromise,
])) as any;
console.log(
`✅ MariaDB 컬럼 조회 완료: ${tableName}, ${rows ? rows.length : 0}개 컬럼`
);
`, [tableName]);
console.log(`[MariaDBConnector] 쿼리 결과:`, rows);
console.log(`[MariaDBConnector] 결과 개수:`, Array.isArray(rows) ? rows.length : 'not array');
await this.disconnect();
return rows as any[];
} catch (error: any) {
console.error(`[MariaDBConnector] getColumns 오류:`, error);
await this.disconnect();
throw new Error(`컬럼 정보 조회 실패: ${error.message}`);
}