diff --git a/frontend/components/dataflow/ConnectionSetupModal.tsx b/frontend/components/dataflow/ConnectionSetupModal.tsx index 056381af..8cb2c831 100644 --- a/frontend/components/dataflow/ConnectionSetupModal.tsx +++ b/frontend/components/dataflow/ConnectionSetupModal.tsx @@ -84,9 +84,20 @@ export const ConnectionSetupModal: React.FC = ({ setSimpleKeySettings({ notes: settings.notes as string, }); - } else if (connectionType === "data-save" && settings.actions) { - // data-save 설정 로드 - 안전하게 처리 - const actionsData = Array.isArray(settings.actions) ? settings.actions : []; + } else if (connectionType === "data-save") { + // data-save 설정 로드 - 안전하게 처리 (다양한 구조 지원) + let actionsData: Record[] = []; + + if (Array.isArray((settings as any).actions)) { + // 직접 actions 배열이 있는 경우 + actionsData = (settings as any).actions; + } else if ((settings as any).plan && Array.isArray((settings as any).plan.actions)) { + // plan 객체 안에 actions가 있는 경우 + actionsData = (settings as any).plan.actions; + } else if (Array.isArray(settings)) { + // settings 자체가 actions 배열인 경우 + actionsData = settings as Record[]; + } setDataSaveSettings({ actions: actionsData.map((action: Record) => ({ id: (action.id as string) || `action-${Date.now()}`, @@ -118,12 +129,19 @@ export const ConnectionSetupModal: React.FC = ({ })), }); - // 전체 실행 조건 로드 - if (settings.control) { - const controlSettings = settings.control as { conditionTree?: ConditionNode[] }; - if (Array.isArray(controlSettings.conditionTree)) { - setConditions(controlSettings.conditionTree || []); - } + // control 설정도 로드 (전체 실행 조건) + if ( + (settings as any).control && + (settings as any).control.conditionTree && + Array.isArray((settings as any).control.conditionTree) + ) { + const conditionTree = (settings as any).control.conditionTree as ConditionNode[]; + setConditions( + conditionTree.map((condition) => ({ + ...condition, + operator: condition.operator || "=", // 기본값 보장 + })), + ); } } else if (connectionType === "external-call") { setExternalCallSettings({ @@ -186,7 +204,7 @@ export const ConnectionSetupModal: React.FC = ({ } else { // 기본값 설정 setSimpleKeySettings({ - notes: `${fromDisplayName}과 ${toDisplayName} 간의 키값 연결`, + notes: existingRel?.note || `${fromDisplayName}과 ${toDisplayName} 간의 키값 연결`, }); setDataSaveSettings({ actions: [] }); } diff --git a/frontend/components/dataflow/DataFlowDesigner.tsx b/frontend/components/dataflow/DataFlowDesigner.tsx index 608f00b7..7ebe19ab 100644 --- a/frontend/components/dataflow/DataFlowDesigner.tsx +++ b/frontend/components/dataflow/DataFlowDesigner.tsx @@ -114,6 +114,7 @@ export const DataFlowDesigner: React.FC = ({ toColumns: Array.isArray(rel.toColumns) ? rel.toColumns : [], connectionType: rel.connectionType || "simple-key", relationshipName: rel.relationshipName || "", + note: rel.note || "", // 🔥 연결 설명 로드 })); setTempRelationships(loadedRelationships); @@ -493,6 +494,7 @@ export const DataFlowDesigner: React.FC = ({ toColumns: relationshipData.to_column_name ? relationshipData.to_column_name.split(",") : [], connectionType: relationshipData.connection_type as "simple-key" | "data-save" | "external-call", relationshipName: relationshipData.relationship_name, + note: (relationshipData.settings as any)?.notes || "", // 🔥 notes를 note로 변환 settings: relationshipData.settings || {}, }; @@ -532,6 +534,7 @@ export const DataFlowDesigner: React.FC = ({ toColumns: relationshipData.to_column_name ? relationshipData.to_column_name.split(",") : [], connectionType: relationshipData.connection_type as "simple-key" | "data-save" | "external-call", relationshipName: relationshipData.relationship_name, + note: (relationshipData.settings as any)?.notes || "", // 🔥 notes를 note로 변환 settings: relationshipData.settings || {}, }; @@ -613,7 +616,7 @@ export const DataFlowDesigner: React.FC = ({ // 연결된 테이블 목록 추출 const tableNames = extractTableNames(nodes); - // 관계 데이터를 JsonRelationship 형태로 변환 (settings 제거 - relationships는 순수 연결 정보만) + // 관계 데이터를 JsonRelationship 형태로 변환 (note 필드 포함) const jsonRelationships: JsonRelationship[] = tempRelationships.map((rel) => ({ id: rel.id, relationshipName: rel.relationshipName, // 🔥 핵심: 관계 이름 포함 @@ -622,6 +625,7 @@ export const DataFlowDesigner: React.FC = ({ fromColumns: rel.fromColumns, toColumns: rel.toColumns, connectionType: rel.connectionType, + note: rel.note, // 🔥 연결 설명 포함 })); // 저장 요청 데이터 구성 diff --git a/frontend/components/dataflow/RelationshipListModal.tsx b/frontend/components/dataflow/RelationshipListModal.tsx index 08f7c11c..6df6c17b 100644 --- a/frontend/components/dataflow/RelationshipListModal.tsx +++ b/frontend/components/dataflow/RelationshipListModal.tsx @@ -49,9 +49,15 @@ export const RelationshipListModal: React.FC = ({ } onSetSelectedColumns(newSelectedColumns); - // 🔥 수정: 데이터베이스에서 관계 설정 정보 로드 + // 🔥 수정: 관계 설정 정보 로드 (임시 관계 우선, 없으면 데이터베이스에서) let relationshipSettings = {}; - if (diagramId && diagramId > 0) { + + // 1. 먼저 임시 관계의 settings 사용 (메모리에 있는 데이터) + if (relationship.settings && Object.keys(relationship.settings).length > 0) { + relationshipSettings = relationship.settings; + } + // 2. 임시 settings가 없고 저장된 관계도인 경우 데이터베이스에서 로드 + else if (diagramId && diagramId > 0) { try { const jsonDiagram = await DataFlowAPI.getJsonDataFlowDiagramById(diagramId, companyCode); if (jsonDiagram && relationship.connectionType === "data-save") { @@ -102,6 +108,7 @@ export const RelationshipListModal: React.FC = ({ existingRelationship: { relationshipName: relationship.relationshipName, connectionType: relationship.connectionType, + note: relationship.note, // 🔥 연결 설명 포함 settings: relationshipSettings, }, }); diff --git a/frontend/components/dataflow/connection/ExternalCallSettings.tsx b/frontend/components/dataflow/connection/ExternalCallSettings.tsx index 13464e8b..f919ad6c 100644 --- a/frontend/components/dataflow/connection/ExternalCallSettings.tsx +++ b/frontend/components/dataflow/connection/ExternalCallSettings.tsx @@ -27,7 +27,7 @@ export const ExternalCallSettings: React.FC = ({ sett + onSettingsChange({ + ...settings, + kakaoAccessToken: e.target.value, + }) + } + placeholder="카카오 개발자 센터에서 발급받은 토큰" + className="text-sm" + /> +

+ 💡{" "} + + 카카오 개발자 센터 + + 에서 앱 등록 후 토큰을 발급받으세요 +

+ + +
+ +