ERP-node/backend-node/src/database/DatabaseConnectorFactory.ts

69 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-09-23 10:45:53 +09:00
import { DatabaseConnector, ConnectionConfig } from '../interfaces/DatabaseConnector';
import { PostgreSQLConnector } from './PostgreSQLConnector';
2025-09-24 10:04:25 +09:00
import { MariaDBConnector } from './MariaDBConnector';
import { MSSQLConnector } from './MSSQLConnector';
import { OracleConnector } from './OracleConnector';
2025-09-26 17:29:20 +09:00
import { RestApiConnector, RestApiConfig } from './RestApiConnector';
2025-09-23 10:45:53 +09:00
export class DatabaseConnectorFactory {
private static connectors = new Map<string, DatabaseConnector>();
static async createConnector(
type: string,
config: ConnectionConfig,
connectionId: number // Added connectionId for unique key
): Promise<DatabaseConnector> {
const key = `${type}-${connectionId}`; // Use connectionId for unique key
if (this.connectors.has(key)) {
return this.connectors.get(key)!;
}
let connector: DatabaseConnector;
switch (type.toLowerCase()) {
case 'postgresql':
connector = new PostgreSQLConnector(config);
break;
2025-09-24 10:04:25 +09:00
case 'mariadb':
case 'mysql': // mysql 타입도 MariaDB 커넥터 사용
connector = new MariaDBConnector(config);
break;
case 'mssql':
connector = new MSSQLConnector(config);
break;
case 'oracle':
connector = new OracleConnector(config);
break;
2025-09-26 17:29:20 +09:00
case 'restapi':
connector = new RestApiConnector(config as RestApiConfig);
break;
2025-09-23 10:45:53 +09:00
// Add other database types here
default:
throw new Error(`지원하지 않는 데이터베이스 타입: ${type}`);
}
this.connectors.set(key, connector);
return connector;
}
static async getConnector(connectionId: number, type: string): Promise<DatabaseConnector | undefined> {
const key = `${type}-${connectionId}`;
return this.connectors.get(key);
}
static async closeConnector(connectionId: number, type: string): Promise<void> {
const key = `${type}-${connectionId}`;
const connector = this.connectors.get(key);
if (connector) {
await connector.disconnect();
this.connectors.delete(key);
}
}
static async closeAll(): Promise<void> {
for (const connector of this.connectors.values()) {
await connector.disconnect();
}
this.connectors.clear();
}
}