제어관리 외부커넥션 설정기능
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
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";
|
||||
import * as mysql from "mysql2/promise";
|
||||
|
||||
export class MariaDBConnector implements DatabaseConnector {
|
||||
private connection: mysql.Connection | null = null;
|
||||
@@ -18,8 +22,18 @@ export class MariaDBConnector implements DatabaseConnector {
|
||||
user: this.config.user,
|
||||
password: this.config.password,
|
||||
database: this.config.database,
|
||||
connectTimeout: this.config.connectionTimeoutMillis,
|
||||
ssl: typeof this.config.ssl === 'boolean' ? undefined : this.config.ssl,
|
||||
// 🔧 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,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -35,7 +49,9 @@ 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();
|
||||
@@ -63,7 +79,18 @@ export class MariaDBConnector implements DatabaseConnector {
|
||||
async executeQuery(query: string): Promise<QueryResult> {
|
||||
try {
|
||||
await this.connect();
|
||||
const [rows, fields] = await this.connection!.query(query);
|
||||
|
||||
// 🔧 쿼리 타임아웃 수동 구현 (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;
|
||||
await this.disconnect();
|
||||
return {
|
||||
rows: rows as any[],
|
||||
@@ -106,17 +133,51 @@ export class MariaDBConnector implements DatabaseConnector {
|
||||
|
||||
async getColumns(tableName: string): Promise<any[]> {
|
||||
try {
|
||||
console.log(`🔍 MariaDB 컬럼 조회 시작: ${tableName}`);
|
||||
await this.connect();
|
||||
const [rows] = await this.connection!.query(`
|
||||
|
||||
// 🔧 컬럼 조회 타임아웃 수동 구현 (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 = `
|
||||
SELECT
|
||||
COLUMN_NAME as column_name,
|
||||
DATA_TYPE as data_type,
|
||||
IS_NULLABLE as is_nullable,
|
||||
COLUMN_DEFAULT as column_default
|
||||
COLUMN_DEFAULT as column_default,
|
||||
COLUMN_COMMENT as column_comment
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?
|
||||
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
|
||||
ORDER BY ORDINAL_POSITION;
|
||||
`, [tableName]);
|
||||
`;
|
||||
|
||||
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}개 컬럼`
|
||||
);
|
||||
await this.disconnect();
|
||||
return rows as any[];
|
||||
} catch (error: any) {
|
||||
@@ -124,4 +185,4 @@ export class MariaDBConnector implements DatabaseConnector {
|
||||
throw new Error(`컬럼 정보 조회 실패: ${error.message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user