From 080188b419a534894e3985d3cbfbfab71a4d2a90 Mon Sep 17 00:00:00 2001 From: dohyeons Date: Tue, 25 Nov 2025 14:57:48 +0900 Subject: [PATCH] =?UTF-8?q?=EC=99=B8=EB=B6=80=20DB=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EC=BF=BC=EB=A6=AC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/yard-3d/HierarchyConfigPanel.tsx | 33 ++++++++++++------- frontend/lib/api/externalDbConnection.ts | 5 +++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/frontend/components/admin/dashboard/widgets/yard-3d/HierarchyConfigPanel.tsx b/frontend/components/admin/dashboard/widgets/yard-3d/HierarchyConfigPanel.tsx index 186ac63f..0dffb0de 100644 --- a/frontend/components/admin/dashboard/widgets/yard-3d/HierarchyConfigPanel.tsx +++ b/frontend/components/admin/dashboard/widgets/yard-3d/HierarchyConfigPanel.tsx @@ -119,18 +119,29 @@ export default function HierarchyConfigPanel({ tablesToLoad.push(hierarchyConfig.material.tableName); } - // 중복 제거 후 로드 + // 중복 제거 후, 아직 캐시에 없는 테이블만 병렬로 로드 const uniqueTables = [...new Set(tablesToLoad)]; - for (const tableName of uniqueTables) { - if (!columnsCache[tableName]) { - try { - const columns = await onLoadColumns(tableName); - const normalized = normalizeColumns(columns); - setColumnsCache((prev) => ({ ...prev, [tableName]: normalized })); - } catch (error) { - console.error(`컬럼 로드 실패 (${tableName}):`, error); - } - } + const tablesToFetch = uniqueTables.filter((tableName) => !columnsCache[tableName]); + + if (tablesToFetch.length === 0) { + return; + } + + setLoadingColumns(true); + try { + await Promise.all( + tablesToFetch.map(async (tableName) => { + try { + const columns = await onLoadColumns(tableName); + const normalized = normalizeColumns(columns); + setColumnsCache((prev) => ({ ...prev, [tableName]: normalized })); + } catch (error) { + console.error(`컬럼 로드 실패 (${tableName}):`, error); + } + }), + ); + } finally { + setLoadingColumns(false); } }; diff --git a/frontend/lib/api/externalDbConnection.ts b/frontend/lib/api/externalDbConnection.ts index 034a60ef..6d211b3d 100644 --- a/frontend/lib/api/externalDbConnection.ts +++ b/frontend/lib/api/externalDbConnection.ts @@ -290,8 +290,13 @@ export class ExternalDbConnectionAPI { static async getTableColumns(connectionId: number, tableName: string): Promise> { try { console.log("컬럼 정보 API 요청:", `${this.BASE_PATH}/${connectionId}/tables/${tableName}/columns`); + // 컬럼 메타데이터 조회는 외부 DB 성능/네트워크 영향으로 오래 걸릴 수 있으므로 + // 기본 30초보다 넉넉한 타임아웃을 사용 const response = await apiClient.get>( `${this.BASE_PATH}/${connectionId}/tables/${tableName}/columns`, + { + timeout: 120000, // 120초 + }, ); console.log("컬럼 정보 API 응답:", response.data); return response.data;