# π¨ μ μ΄κ΄λ¦¬ - λ°μ΄ν° μ°κ²° μ€μ UI μ¬μ€κ³ κ³νμ
## π νλ‘μ νΈ κ°μ
### λͺ©ν
- κΈ°μ‘΄ λͺ¨λ¬ κΈ°λ° νλ λ§€νμ λ©μΈ νλ©΄μΌλ‘ ν΅ν©
- μ€λ³΅λ ν
μ΄λΈ μ ν κ³Όμ μ κ±°
- μκ°μ νλ μ°κ²° λ§€ν ꡬν
- μ’μ° λΆν λ μ΄μμμΌλ‘ μ 보 κ°μμ± ν₯μ
### νμ¬ λ¬Έμ μ
- β **μ΄μ€ μμ
**: ν
μ΄λΈμ 3λ² μ νν΄μΌ ν¨ (λλΈν΄λ¦ β λͺ¨λ¬ β μ¬μ ν)
- β **νΌλμ€λ¬μ΄ UX**: μ¬μ μ νμ μλ―Έκ° μμ΄μ§
- β **λΆνμν λͺ¨λ¬**: μ°κ²° μ€μ μ΄ λ©μΈ κΈ°λ₯μΈλ° μ¨κ²¨μ Έ μμ
- β **μκ°μ νΌλλ°± λΆμ‘±**: νλ λ§€ν κ΄κ³κ° λͺ
ννμ§ μμ
## π― μλ‘μ΄ UI ꡬ쑰
### λ μ΄μμ ꡬμ±
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β μ μ΄κ΄λ¦¬ - λ°μ΄ν° μ°κ²° μ€μ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β μ’μΈ‘ ν¨λ (30%) β μ°μΈ‘ ν¨λ (70%) β
β - μ°κ²° νμ
μ ν β - λ¨κ³λ³ μ€μ UI β
β - λ§€ν μ 보 λͺ¨λν°λ§ β - μκ°μ νλ λ§€ν β
β - μμΈ μ€μ λͺ©λ‘ β - μ€μκ° μ°κ²°μ νμ β
β - μ‘μ
λ²νΌ β - λλκ·Έ μ€ λλ‘ μ§μ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
## π§ ꡬν λ¨κ³
### Phase 1: κΈ°λ³Έ ꡬ쑰 ꡬμΆ
- [ ] μ’μ° λΆν λ μ΄μμ μ»΄ν¬λνΈ μμ±
- [ ] κΈ°μ‘΄ λͺ¨λ¬ μ»΄ν¬λνΈλ€μ λ©μΈ νλ©΄μ©μΌλ‘ 리ν©ν λ§
- [ ] μ°κ²° νμ
μ ν μ»΄ν¬λνΈ κ΅¬ν
### Phase 2: μ’μΈ‘ ν¨λ ꡬν
- [ ] μ°κ²° νμ
μ ν (λ°μ΄ν° μ μ₯ / μΈλΆ νΈμΆ)
- [ ] μ€μκ° λ§€ν μ 보 νμ
- [ ] λ§€ν μμΈ λͺ©λ‘ μ»΄ν¬λνΈ
- [ ] κ³ κΈ μ€μ ν¨λ
### Phase 3: μ°μΈ‘ ν¨λ ꡬν
- [ ] λ¨κ³λ³ μ§ν UI (μ°κ²° β ν
μ΄λΈ β λ§€ν)
- [ ] μκ°μ νλ λ§€ν μμ
- [ ] SVG κΈ°λ° μ°κ²°μ μμ€ν
- [ ] λλκ·Έ μ€ λλ‘ λ§€ν κΈ°λ₯
### Phase 4: κ³ κΈ κΈ°λ₯
- [ ] μ€μκ° κ²μ¦ λ° νΌλλ°±
- [ ] λ§€ν 미리보기 κΈ°λ₯
- [ ] μ€μ μ μ₯/λΆλ¬μ€κΈ°
- [ ] ν
μ€νΈ μ€ν κΈ°λ₯
## π νμΌ κ΅¬μ‘°
### μλ‘ μμ±ν μ»΄ν¬λνΈ
```
frontend/components/dataflow/connection/redesigned/
βββ DataConnectionDesigner.tsx # λ©μΈ 컨ν
μ΄λ
βββ LeftPanel/
β βββ ConnectionTypeSelector.tsx # μ°κ²° νμ
μ ν
β βββ MappingInfoPanel.tsx # λ§€ν μ 보 νμ
β βββ MappingDetailList.tsx # λ§€ν μμΈ λͺ©λ‘
β βββ AdvancedSettings.tsx # κ³ κΈ μ€μ
β βββ ActionButtons.tsx # μ‘μ
λ²νΌλ€
βββ RightPanel/
β βββ StepProgress.tsx # λ¨κ³ μ§ν νμ
β βββ ConnectionStep.tsx # 1λ¨κ³: μ°κ²° μ ν
β βββ TableStep.tsx # 2λ¨κ³: ν
μ΄λΈ μ ν
β βββ FieldMappingStep.tsx # 3λ¨κ³: νλ λ§€ν
β βββ VisualMapping/
β βββ FieldMappingCanvas.tsx # μκ°μ λ§€ν μΊλ²μ€
β βββ FieldColumn.tsx # νλ μ»¬λΌ μ»΄ν¬λνΈ
β βββ ConnectionLine.tsx # SVG μ°κ²°μ
β βββ MappingControls.tsx # λ§€ν μ μ΄ λꡬ
βββ types/
βββ redesigned.ts # νμ
μ μ
```
### μμ ν κΈ°μ‘΄ νμΌ
```
frontend/components/dataflow/connection/
βββ DataSaveSettings.tsx # μ UIλ‘ κ΅μ²΄
βββ ConnectionSelectionPanel.tsx # μ¬μ¬μ©μ μν 리ν©ν λ§
βββ TableSelectionPanel.tsx # μ¬μ¬μ©μ μν 리ν©ν λ§
βββ ActionFieldMappings.tsx # λ κ±°μ μ²λ¦¬
```
## π¨ UI μ»΄ν¬λνΈ μμΈ
### 1. μ°κ²° νμ
μ ν (ConnectionTypeSelector)
```typescript
interface ConnectionType {
id: "data_save" | "external_call";
label: string;
description: string;
icon: React.ReactNode;
}
const connectionTypes: ConnectionType[] = [
{
id: "data_save",
label: "λ°μ΄ν° μ μ₯",
description: "INSERT/UPDATE/DELETE μμ
",
icon: ,
},
{
id: "external_call",
label: "μΈλΆ νΈμΆ",
description: "API/Webhook νΈμΆ",
icon: ,
},
];
```
### 2. μκ°μ νλ λ§€ν (FieldMappingCanvas)
```typescript
interface FieldMapping {
id: string;
fromField: ColumnInfo;
toField: ColumnInfo;
transformRule?: string;
isValid: boolean;
validationMessage?: string;
}
interface MappingLine {
id: string;
fromX: number;
fromY: number;
toX: number;
toY: number;
isValid: boolean;
isHovered: boolean;
}
```
### 3. λ§€ν μ 보 ν¨λ (MappingInfoPanel)
```typescript
interface MappingStats {
totalMappings: number;
validMappings: number;
invalidMappings: number;
missingRequiredFields: number;
estimatedRows: number;
actionType: "INSERT" | "UPDATE" | "DELETE";
}
```
## π λ°μ΄ν° νλ‘μ°
### μν κ΄λ¦¬
```typescript
interface DataConnectionState {
// κΈ°λ³Έ μ€μ
connectionType: "data_save" | "external_call";
currentStep: 1 | 2 | 3;
// μ°κ²° μ 보
fromConnection?: Connection;
toConnection?: Connection;
fromTable?: TableInfo;
toTable?: TableInfo;
// λ§€ν μ 보
fieldMappings: FieldMapping[];
mappingStats: MappingStats;
// UI μν
selectedMapping?: string;
isLoading: boolean;
validationErrors: ValidationError[];
}
```
### μ΄λ²€νΈ νΈλ€λ§
```typescript
interface DataConnectionActions {
// μ°κ²° νμ
setConnectionType: (type: "data_save" | "external_call") => void;
// λ¨κ³ μ§ν
goToStep: (step: 1 | 2 | 3) => void;
// μ°κ²°/ν
μ΄λΈ μ ν
selectConnection: (type: "from" | "to", connection: Connection) => void;
selectTable: (type: "from" | "to", table: TableInfo) => void;
// νλ λ§€ν
createMapping: (fromField: ColumnInfo, toField: ColumnInfo) => void;
updateMapping: (mappingId: string, updates: Partial) => void;
deleteMapping: (mappingId: string) => void;
// κ²μ¦ λ° μ μ₯
validateMappings: () => Promise;
saveMappings: () => Promise;
testExecution: () => Promise;
}
```
## π― μ¬μ©μ κ²½ν (UX) κ°μ μ
### Before (κΈ°μ‘΄)
1. ν
μ΄λΈ λλΈν΄λ¦ β νλ©΄μ νμ
2. λͺ¨λ¬ μ΄κΈ° β λ€μ ν
μ΄λΈ μ ν
3. μΈλΆ 컀λ₯μ
μ€μ β λ λ€μ ν
μ΄λΈ μ ν
4. νλ λ§€ν β ν
μ€νΈ κΈ°λ° λ§€ν
### After (κ°μ )
1. **μ°κ²° νμ
μ ν** β λͺ©μ λͺ
νν
2. **μ°κ²° μ ν** β ν λ²μ FROM/TO μ€μ
3. **ν
μ΄λΈ μ ν** β μ¦μ νλ μ 보 λ‘λ
4. **μκ°μ λ§€ν** β λλκ·Έ μ€ λλ‘μΌλ‘ μ§κ΄μ μ°κ²°
## π ꡬν μ°μ μμ
### π₯ High Priority
1. **κΈ°λ³Έ λ μ΄μμ** - μ’μ° λΆν ꡬ쑰
2. **μ°κ²° νμ
μ ν** - λ°μ΄ν° μ μ₯/μΈλΆ νΈμΆ
3. **λ¨κ³λ³ μ§ν** - μ°κ²° β ν
μ΄λΈ β λ§€ν
4. **κΈ°λ³Έ νλ λ§€ν** - λλκ·Έ μ€ λλ‘ μμ΄ ν΄λ¦ κΈ°λ°
### πΆ Medium Priority
1. **μκ°μ μ°κ²°μ ** - SVG κΈ°λ° λΌμΈ νμ
2. **μ€μκ° κ²μ¦** - νμ
νΈνμ± μ²΄ν¬
3. **λ§€ν μ 보 ν¨λ** - ν΅κ³ λ° μν νμ
4. **λλκ·Έ μ€ λλ‘** - κ³ κΈ λ§€ν κΈ°λ₯
### π΅ Low Priority
1. **κ³ κΈ μ€μ ** - νΈλμμ
, λ°°μΉ μ€μ
2. **미리보기 κΈ°λ₯** - λ°μ΄ν° λ³ν 미리보기
3. **μ€μ ν
νλ¦Ώ** - μμ£Ό μ¬μ©νλ λ§€ν μ μ₯
4. **μ±λ₯ μ΅μ ν** - λμ©λ ν
μ΄λΈ μ²λ¦¬
## π
κ°λ° μΌμ
### Week 1: 기본 ꡬ쑰
- [ ] λ μ΄μμ μ»΄ν¬λνΈ μμ±
- [ ] μ°κ²° νμ
μ ν ꡬν
- [ ] κΈ°μ‘΄ μ»΄ν¬λνΈ λ¦¬ν©ν λ§
### Week 2: ν΅μ¬ κΈ°λ₯
- [ ] λ¨κ³λ³ μ§ν UI
- [ ] μ°κ²°/ν
μ΄λΈ μ ν ν΅ν©
- [ ] κΈ°λ³Έ νλ λ§€ν ꡬν
### Week 3: μκ°μ κ°μ
- [ ] SVG μ°κ²°μ μμ€ν
- [ ] λλκ·Έ μ€ λλ‘ λ§€ν
- [ ] μ€μκ° κ²μ¦ κΈ°λ₯
### Week 4: μμ± λ° ν
μ€νΈ
- [ ] κ³ κΈ κΈ°λ₯ ꡬν
- [ ] ν΅ν© ν
μ€νΈ
- [ ] μ¬μ©μ ν
μ€νΈ λ° νΌλλ°± λ°μ
## π κΈ°μ μ κ³ λ €μ¬ν
### μ±λ₯ μ΅μ ν
- **κ°μν**: λμ©λ νλ λͺ©λ‘ μ²λ¦¬
- **λ©λͺ¨μ΄μ μ΄μ
**: λΆνμν 리λ λλ§ λ°©μ§
- **μ§μ° λ‘λ©**: νμν μμ μλ§ λ°μ΄ν° λ‘λ
### μ κ·Όμ±
- **ν€λ³΄λ λ€λΉκ²μ΄μ
**: λͺ¨λ κΈ°λ₯μ ν€λ³΄λλ‘ μ κ·Ό κ°λ₯
- **μ€ν¬λ¦° 리λ**: μκ°μ λ§€νμ λ체 ν
μ€νΈ μ 곡
- **μμ λλΉ**: μ°κ²°μ κ³Ό μν νμμ λͺ
νν ꡬλΆ
### νμ₯μ±
- **νλ¬κ·ΈμΈ ꡬ쑰**: μλ‘μ΄ μ°κ²° νμ
μ½κ² μΆκ°
- **컀μ€ν
λ³ν**: μ¬μ©μ μ μ λ°μ΄ν° λ³ν κ·μΉ
- **API νμ₯**: μΈλΆ μμ€ν
κ³Όμ μ°λ μ§μ
---
## π― λ€μ λ¨κ³
μ΄ κ³νμλ₯Ό λ°νμΌλ‘ **Phase 1λΆν° μμ°¨μ μΌλ‘ ꡬν**μ μμνκ² μ΅λλ€.
**첫 λ²μ§Έ μμ
**: μ’μ° λΆν λ μ΄μμκ³Ό μ°κ²° νμ
μ ν μ»΄ν¬λνΈ κ΅¬ν
ꡬνμ μμνμκ² μ΄μ? π