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 ;
}