From c486a31787f076f9634d3b2efda5663f3f001959 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Thu, 11 Dec 2025 13:48:34 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=97=85=EB=A1=9C=EB=93=9C?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=A4=91=EA=B0=84=EC=A0=80=EC=9E=A5(?= =?UTF-8?q?=EB=8B=A4=EB=93=AC=EA=B8=B0=ED=95=98=EB=A9=B4=EB=90=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend-node/src/controllers/fileController.ts | 14 ++++++++++++++ backend-node/src/services/dynamicFormService.ts | 15 ++++++++++++++- frontend/components/screen/EditModal.tsx | 8 ++++++++ .../file-upload/FileUploadComponent.tsx | 12 ++++++++++-- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/backend-node/src/controllers/fileController.ts b/backend-node/src/controllers/fileController.ts index fe3d5cfd..d4e8d0cf 100644 --- a/backend-node/src/controllers/fileController.ts +++ b/backend-node/src/controllers/fileController.ts @@ -343,6 +343,20 @@ export const uploadFiles = async ( // πŸ†• λ ˆμ½”λ“œ λͺ¨λ“œ: ν•΄λ‹Ή ν–‰μ˜ attachments 컬럼 μžλ™ μ—…λ°μ΄νŠΈ const isRecordMode = req.body.isRecordMode === "true" || req.body.isRecordMode === true; + + // πŸ” 디버깅: λ ˆμ½”λ“œ λͺ¨λ“œ 쑰건 확인 + console.log("πŸ” [파일 μ—…λ‘œλ“œ] λ ˆμ½”λ“œ λͺ¨λ“œ 쑰건 확인:", { + isRecordMode, + linkedTable, + recordId, + columnName, + finalTargetObjid, + "req.body.isRecordMode": req.body.isRecordMode, + "req.body.linkedTable": req.body.linkedTable, + "req.body.recordId": req.body.recordId, + "req.body.columnName": req.body.columnName, + }); + if (isRecordMode && linkedTable && recordId && columnName) { try { // ν•΄λ‹Ή λ ˆμ½”λ“œμ˜ λͺ¨λ“  μ²¨λΆ€νŒŒμΌ 쑰회 diff --git a/backend-node/src/services/dynamicFormService.ts b/backend-node/src/services/dynamicFormService.ts index 99d6257c..205cd217 100644 --- a/backend-node/src/services/dynamicFormService.ts +++ b/backend-node/src/services/dynamicFormService.ts @@ -865,6 +865,9 @@ export class DynamicFormService { return `${key} = $${index + 1}::numeric`; } else if (dataType === 'boolean') { return `${key} = $${index + 1}::boolean`; + } else if (dataType === 'jsonb' || dataType === 'json') { + // πŸ†• JSONB/JSON νƒ€μž…μ€ λͺ…μ‹œμ  μΊμŠ€νŒ… + return `${key} = $${index + 1}::jsonb`; } else { // λ¬Έμžμ—΄ νƒ€μž…μ€ μΊμŠ€νŒ… λΆˆν•„μš” return `${key} = $${index + 1}`; @@ -872,7 +875,17 @@ export class DynamicFormService { }) .join(", "); - const values: any[] = Object.values(changedFields); + // πŸ†• JSONB νƒ€μž… 값은 JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜ + const values: any[] = Object.keys(changedFields).map((key) => { + const value = changedFields[key]; + const dataType = columnTypes[key]; + + // JSONB/JSON νƒ€μž…μ΄κ³  λ°°μ—΄/객체인 경우 JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜ + if ((dataType === 'jsonb' || dataType === 'json') && (Array.isArray(value) || (typeof value === 'object' && value !== null))) { + return JSON.stringify(value); + } + return value; + }); values.push(id); // WHERE 쑰건용 ID μΆ”κ°€ // πŸ”‘ Primary Key νƒ€μž…μ— 맞게 μΊμŠ€νŒ… diff --git a/frontend/components/screen/EditModal.tsx b/frontend/components/screen/EditModal.tsx index 9dcb58bf..0a87db3f 100644 --- a/frontend/components/screen/EditModal.tsx +++ b/frontend/components/screen/EditModal.tsx @@ -767,6 +767,14 @@ export const EditModal: React.FC = ({ className }) => { tableName: screenData.screenInfo?.tableName, // ν…Œμ΄λΈ”λͺ… μΆ”κ°€ screenId: modalState.screenId, // ν™”λ©΄ ID μΆ”κ°€ }; + + // πŸ” 디버깅: enrichedFormData 확인 + console.log("πŸ”‘ [EditModal] enrichedFormData 생성:", { + "screenData.screenInfo": screenData.screenInfo, + "screenData.screenInfo?.tableName": screenData.screenInfo?.tableName, + "enrichedFormData.tableName": enrichedFormData.tableName, + "enrichedFormData.id": enrichedFormData.id, + }); return ( = ({ const isRecordMode = !!(formData?.id && !String(formData.id).startsWith('temp_')); const recordTableName = formData?.tableName || component.tableName; const recordId = formData?.id; - const columnName = component.columnName || component.id || 'attachments'; + // πŸ”‘ 컬럼λͺ… κ²°μ •: λ ˆμ½”λ“œ λͺ¨λ“œμ—μ„œλŠ” 무쑰건 'attachments' μ‚¬μš© + // component.columnNameμ΄λ‚˜ component.idλŠ” '파일_μ—…λ‘œλ“œ' 같은 ν•œκΈ€ 라벨일 수 μžˆμ–΄μ„œ DB 컬럼λͺ…μœΌλ‘œ 뢀적합 + // λ ˆμ½”λ“œ λͺ¨λ“œκ°€ 아닐 λ•Œλ§Œ component.columnName λ˜λŠ” component.id μ‚¬μš© + const columnName = isRecordMode ? 'attachments' : (component.columnName || component.id || 'attachments'); // πŸ”‘ λ ˆμ½”λ“œ λͺ¨λ“œμš© targetObjid 생성 const getRecordTargetObjid = useCallback(() => { @@ -140,8 +143,13 @@ const FileUploadComponent: React.FC = ({ targetObjid: getRecordTargetObjid(), uniqueKey: getUniqueKey(), formDataKeys: formData ? Object.keys(formData) : [], + // πŸ” μΆ”κ°€ 디버깅: μ–΄λ””μ„œ tableName이 μ˜€λŠ”μ§€ 확인 + "formData.tableName": formData?.tableName, + "component.tableName": component.tableName, + "component.columnName": component.columnName, + "component.id": component.id, }); - }, [isRecordMode, recordTableName, recordId, columnName, getRecordTargetObjid, getUniqueKey, formData]); + }, [isRecordMode, recordTableName, recordId, columnName, getRecordTargetObjid, getUniqueKey, formData, component.tableName, component.columnName, component.id]); // πŸ†• λ ˆμ½”λ“œ ID λ³€κ²½ μ‹œ 파일 λͺ©λ‘ μ΄ˆκΈ°ν™” 및 μƒˆλ‘œ λ‘œλ“œ const prevRecordIdRef = useRef(null);