From f10946ae5bd47ed42be02c82f5f42900ccaac203 Mon Sep 17 00:00:00 2001 From: SeongHyun Kim Date: Fri, 27 Mar 2026 13:44:45 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20screen=5Flayouts=5Fpop=20=EC=9D=B4?= =?UTF-8?q?=EC=A4=91=20=EA=B0=90=EC=8B=B8=EA=B8=B0(double-wrap)=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=ED=95=B4=EC=A0=9C=20getLayoutPop/saveLayo?= =?UTF-8?q?utPop=EC=97=90=EC=84=9C=20layout=5Fdata=EA=B0=80=20=EC=9D=B4?= =?UTF-8?q?=EC=A4=91=EC=9C=BC=EB=A1=9C=20=EA=B0=90=EC=8B=B8=EC=A7=84=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20(layout=5Fdata.layout=5Fdata.components)?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=20=EA=B0=90=EC=A7=80=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C.=2013=EA=B0=9C=20=EC=8B=A0=EA=B7=9C=20POP=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=9D=B4=20=EB=B9=88=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=91=9C=EC=8B=9C=EB=90=98=EB=8D=98=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/services/screenManagementService.ts | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/backend-node/src/services/screenManagementService.ts b/backend-node/src/services/screenManagementService.ts index 9d5d56a5..e54b2cfa 100644 --- a/backend-node/src/services/screenManagementService.ts +++ b/backend-node/src/services/screenManagementService.ts @@ -5957,7 +5957,21 @@ export class ScreenManagementService { return null; } - const layoutData = layout.layout_data; + let layoutData = layout.layout_data; + + // 이중 래핑 감지 및 자동 언래핑 + // layout_data 컬럼에 { version, layout_data: { components, ... } } 형태로 저장된 경우 + // 실제 레이아웃은 내부 layout_data에 있으므로 언래핑한다 + if ( + layoutData && + layoutData.layout_data && + typeof layoutData.layout_data === "object" && + !layoutData.components && + layoutData.layout_data.components + ) { + console.log(`POP 레이아웃 이중 래핑 감지 (screen_id=${screenId}), 자동 언래핑`); + layoutData = layoutData.layout_data; + } // v1 → v2 자동 마이그레이션 if (layoutData && layoutData.version === "pop-1.0") { @@ -5994,10 +6008,22 @@ export class ScreenManagementService { console.log(`=== POP 레이아웃 저장 (v5 그리드 시스템) ===`); console.log(`화면 ID: ${screenId}, 회사: ${companyCode}`); + // 이중 래핑 방지: { version, layout_data: { components, ... } } 형태로 전달된 경우 언래핑 + if ( + layoutData && + layoutData.layout_data && + typeof layoutData.layout_data === "object" && + !layoutData.components && + layoutData.layout_data.components + ) { + console.log(`저장 시 이중 래핑 감지 (screen_id=${screenId}), 자동 언래핑`); + layoutData = layoutData.layout_data; + } + // v5 그리드 레이아웃만 지원 const componentCount = Object.keys(layoutData.components || {}).length; console.log(`컴포넌트: ${componentCount}개`); - + // v5 형식 검증 if (layoutData.version && layoutData.version !== "pop-5.0") { console.warn(`레거시 버전 감지 (${layoutData.version}), v5로 변환 필요`);