From 5c6469c75ca8ce2b4e44d94f5c859cc4af419585 Mon Sep 17 00:00:00 2001 From: kjs Date: Thu, 12 Mar 2026 02:02:45 +0900 Subject: [PATCH] refactor: simplify node editor page and update admin page registry - Removed the redirect logic from the NodeEditorPage, now directly rendering the DataFlowPage component. - Updated the AdminPageRenderer to correctly register the new node editor page and adjust the cascading management imports for consistency. - Enhanced the dynamic import logic to streamline page loading and improve performance. Made-with: Cursor --- .../dataflow/node-editorList/page.tsx | 21 +---- .../components/layout/AdminPageRenderer.tsx | 76 ++++++++++++------- 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/frontend/app/(main)/admin/systemMng/dataflow/node-editorList/page.tsx b/frontend/app/(main)/admin/systemMng/dataflow/node-editorList/page.tsx index 5930ecb9..f05b8164 100644 --- a/frontend/app/(main)/admin/systemMng/dataflow/node-editorList/page.tsx +++ b/frontend/app/(main)/admin/systemMng/dataflow/node-editorList/page.tsx @@ -1,24 +1,7 @@ "use client"; -/** - * 제어 시스템 페이지 (리다이렉트) - * 이 페이지는 /admin/dataflow로 리다이렉트됩니다. - */ - -import { useEffect } from "react"; -import { useRouter } from "next/navigation"; +import DataFlowPage from "../page"; export default function NodeEditorPage() { - const router = useRouter(); - - useEffect(() => { - // /admin/dataflow 메인 페이지로 리다이렉트 - router.replace("/admin/systemMng/dataflow"); - }, [router]); - - return ( -
-
제어 관리 페이지로 이동중...
-
- ); + return ; } diff --git a/frontend/components/layout/AdminPageRenderer.tsx b/frontend/components/layout/AdminPageRenderer.tsx index 6f7ba4a4..a9e01016 100644 --- a/frontend/components/layout/AdminPageRenderer.tsx +++ b/frontend/components/layout/AdminPageRenderer.tsx @@ -82,7 +82,9 @@ const ADMIN_PAGE_REGISTRY: Record> = { "/admin/systemMng/tableMngList": dynamic(() => import("@/app/(main)/admin/systemMng/tableMngList/page"), { ssr: false, loading: LoadingFallback }), "/admin/systemMng/i18nList": dynamic(() => import("@/app/(main)/admin/systemMng/i18nList/page"), { ssr: false, loading: LoadingFallback }), "/admin/systemMng/collection-managementList": dynamic(() => import("@/app/(main)/admin/systemMng/collection-managementList/page"), { ssr: false, loading: LoadingFallback }), + "/admin/systemMng/cascading-managementList": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }), "/admin/systemMng/dataflow": dynamic(() => import("@/app/(main)/admin/systemMng/dataflow/page"), { ssr: false, loading: LoadingFallback }), + "/admin/systemMng/dataflow/node-editorList": dynamic(() => import("@/app/(main)/admin/systemMng/dataflow/page"), { ssr: false, loading: LoadingFallback }), // 자동화 관리 "/admin/automaticMng/flowMgmtList": dynamic(() => import("@/app/(main)/admin/automaticMng/flowMgmtList/page"), { ssr: false, loading: LoadingFallback }), @@ -117,13 +119,13 @@ const ADMIN_PAGE_REGISTRY: Record> = { // 기타 "/admin/cascading-management": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }), - "/admin/cascading-relations": dynamic(() => import("@/app/(main)/admin/cascading-relations/page"), { ssr: false, loading: LoadingFallback }), + "/admin/cascading-relations": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }), "/admin/layouts": dynamic(() => import("@/app/(main)/admin/layouts/page"), { ssr: false, loading: LoadingFallback }), "/admin/templates": dynamic(() => import("@/app/(main)/admin/templates/page"), { ssr: false, loading: LoadingFallback }), "/admin/monitoring": dynamic(() => import("@/app/(main)/admin/monitoring/page"), { ssr: false, loading: LoadingFallback }), "/admin/standards": dynamic(() => import("@/app/(main)/admin/standards/page"), { ssr: false, loading: LoadingFallback }), "/admin/flow-external-db": dynamic(() => import("@/app/(main)/admin/flow-external-db/page"), { ssr: false, loading: LoadingFallback }), - "/admin/auto-fill": dynamic(() => import("@/app/(main)/admin/auto-fill/page"), { ssr: false, loading: LoadingFallback }), + "/admin/auto-fill": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }), }; const DYNAMIC_ADMIN_IMPORTS: Record Promise> = { @@ -135,7 +137,7 @@ const DYNAMIC_ADMIN_IMPORTS: Record Promise> = { "/admin/aiAssistant/chat": () => import("@/app/(main)/admin/aiAssistant/chat/page"), "/admin/screenMng/barcodeList": () => import("@/app/(main)/admin/screenMng/barcodeList/page"), "/admin/automaticMng/batchmngList/create": () => import("@/app/(main)/admin/automaticMng/batchmngList/create/page"), - "/admin/systemMng/dataflow/node-editorList": () => import("@/app/(main)/admin/systemMng/dataflow/node-editorList/page"), + "/admin/systemMng/dataflow/node-editorList": () => import("@/app/(main)/admin/systemMng/dataflow/page"), "/admin/standards/new": () => import("@/app/(main)/admin/standards/new/page"), }; @@ -201,25 +203,52 @@ function DynamicAdminLoader({ url, params }: { url: string; params?: Record { - const staticImport = DYNAMIC_ADMIN_IMPORTS[url]; - if (staticImport) { - staticImport() - .then((mod) => setComponent(() => mod.default)) - .catch(() => setFailed(true)); - return; - } + let cancelled = false; - for (const { pattern, getImport, extractParams } of DYNAMIC_ADMIN_PATTERNS) { - const match = url.match(pattern); - if (match) { - getImport() - .then((mod) => setComponent(() => mod.default)) - .catch(() => setFailed(true)); + const tryLoad = async () => { + // 1) 정적 import 목록 + const staticImport = DYNAMIC_ADMIN_IMPORTS[url]; + if (staticImport) { + try { + const mod = await staticImport(); + if (!cancelled) setComponent(() => mod.default); + } catch { + if (!cancelled) setFailed(true); + } return; } - } - setFailed(true); + // 2) 동적 라우트 패턴 매칭 + for (const { pattern, getImport } of DYNAMIC_ADMIN_PATTERNS) { + const match = url.match(pattern); + if (match) { + try { + const mod = await getImport(); + if (!cancelled) setComponent(() => mod.default); + } catch { + if (!cancelled) setFailed(true); + } + return; + } + } + + // 3) URL 경로 기반 자동 import 시도 + const pagePath = url.replace(/^\//, ""); + try { + const mod = await import( + /* webpackMode: "lazy" */ + /* webpackInclude: /\/page\.tsx$/ */ + `@/app/(main)/${pagePath}/page` + ); + if (!cancelled) setComponent(() => mod.default); + } catch { + console.warn("[DynamicAdminLoader] 자동 import 실패:", url); + if (!cancelled) setFailed(true); + } + }; + + tryLoad(); + return () => { cancelled = true; }; }, [url]); if (failed) return ; @@ -291,12 +320,7 @@ export function AdminPageRenderer({ url }: AdminPageRendererProps) { } } - // 정적 동적 import 목록에 있으면 - if (DYNAMIC_ADMIN_IMPORTS[cleanUrl]) { - console.log("[AdminPageRenderer] → 동적 import:", cleanUrl); - return ; - } - - console.error("[AdminPageRenderer] 미등록 URL:", cleanUrl); - return ; + // 레지스트리/패턴에 없으면 DynamicAdminLoader가 자동 import 시도 + console.log("[AdminPageRenderer] → 자동 import 시도:", cleanUrl); + return ; }