# 데이터 소스 일관성 개선 완료 ## 문제점 기존에는 데이터 소스 설정이 일관성 없이 동작했습니다: - ❌ 테이블 위젯에서 선택한 행 → 노드는 선택된 행만 처리 - ❌ 플로우 위젯에서 선택한 데이터 → 노드는 **전체 테이블** 조회 (예상과 다름) - ❌ 노드에 `dataSourceType` 설정이 있어도 백엔드가 무시 ## 해결 방법 ### 1. 백엔드 로직 개선 #### 테이블 소스 노드 (내부 DB) ```typescript // nodeFlowExecutionService.ts - executeTableSource() const nodeDataSourceType = dataSourceType || "context-data"; if (nodeDataSourceType === "context-data") { // 버튼에서 전달된 데이터 사용 (폼, 선택 항목 등) return context.sourceData; } if (nodeDataSourceType === "table-all") { // 테이블 전체 데이터를 직접 조회 const sql = `SELECT * FROM ${tableName}`; return await query(sql); } ``` #### 외부 DB 소스 노드 ```typescript // nodeFlowExecutionService.ts - executeExternalDBSource() const nodeDataSourceType = dataSourceType || "context-data"; if (nodeDataSourceType === "context-data") { // 버튼에서 전달된 데이터 사용 return context.sourceData; } if (nodeDataSourceType === "table-all") { // 외부 DB 테이블 전체 데이터를 직접 조회 const result = await poolService.executeQuery(connectionId, sql); return result; } ``` ### 2. 데이터 흐름 정리 ``` ┌──────────────────────────────────────────────────────────┐ │ 버튼 클릭 │ ├──────────────────────────────────────────────────────────┤ │ 버튼 데이터 소스 설정: │ │ - form │ │ - table-selection │ │ - table-all │ │ - flow-selection │ │ - flow-step-all │ └──────────────────────────────────────────────────────────┘ ↓ prepareContextData() (버튼에서 설정한 데이터 준비) ↓ ┌──────────────────────────────────────────────────────────┐ │ contextData = { │ │ sourceData: [...] // 버튼에서 전달된 데이터 │ │ formData: {...} │ │ selectedRowsData: [...] │ │ tableAllData: [...] │ │ } │ └──────────────────────────────────────────────────────────┘ ↓ 노드 플로우 실행 ↓ ┌──────────────────────────────────────────────────────────┐ │ 테이블 소스 노드 │ ├──────────────────────────────────────────────────────────┤ │ 노드 데이터 소스 설정: │ │ │ │ context-data 모드: │ │ → contextData.sourceData 사용 │ │ → 버튼에서 전달된 데이터 그대로 사용 │ │ │ │ table-all 모드: │ │ → contextData 무시 │ │ → DB에서 테이블 전체 데이터 직접 조회 │ └──────────────────────────────────────────────────────────┘ ``` ## 사용 시나리오 ### 시나리오 1: 선택된 항목만 처리 ``` [버튼 설정] - 데이터 소스: table-selection [노드 설정] - 테이블 소스 노드: context-data [결과] ✅ 사용자가 선택한 행만 제어 실행 ``` ### 시나리오 2: 테이블 전체 처리 (버튼 방식) ``` [버튼 설정] - 데이터 소스: table-all [노드 설정] - 테이블 소스 노드: context-data [결과] ✅ 버튼이 테이블 전체 데이터를 로드하여 전달 ✅ 노드는 전달받은 전체 데이터 처리 ``` ### 시나리오 3: 테이블 전체 처리 (노드 방식) ``` [버튼 설정] - 데이터 소스: 무관 (또는 form) [노드 설정] - 테이블 소스 노드: table-all [결과] ✅ 버튼 데이터 무시 ✅ 노드가 직접 테이블 전체 데이터 조회 ``` ### 시나리오 4: 폼 데이터로 처리 ``` [버튼 설정] - 데이터 소스: form [노드 설정] - 테이블 소스 노드: context-data [결과] ✅ 폼 입력값만 제어 실행 ``` ## 일관성 규칙 ### 규칙 1: 노드가 context-data 모드일 때 - **버튼에서 전달된 데이터를 그대로 사용** - 버튼의 `controlDataSource` 설정이 중요 - `form` → 폼 데이터 사용 - `table-selection` → 선택된 행 사용 - `table-all` → 테이블 전체 사용 (버튼이 로드) - `flow-selection` → 플로우 선택 항목 사용 ### 규칙 2: 노드가 table-all 모드일 때 - **버튼 설정 무시** - 노드가 직접 DB에서 전체 데이터 조회 - 대량 데이터 시 성능 주의 ### 규칙 3: 기본 동작 - 노드의 `dataSourceType`이 없으면 `context-data` 기본값 - 버튼의 `controlDataSource`가 없으면 자동 판단 ## 권장 사항 ### 일반적인 사용 패턴 | 상황 | 버튼 설정 | 노드 설정 | |------|----------|----------| | 선택 항목 처리 | `table-selection` | `context-data` | | 폼 데이터 처리 | `form` | `context-data` | | 전체 데이터 처리 (소량) | `table-all` | `context-data` | | 전체 데이터 처리 (대량) | `form` 또는 무관 | `table-all` | | 플로우 선택 처리 | `flow-selection` | `context-data` | ### 성능 고려사항 **버튼에서 전체 로드 vs 노드에서 전체 조회:** ``` 버튼 방식 (table-all): 장점: 한 번만 조회하여 여러 노드에서 재사용 가능 단점: 플로우 실행 전에 전체 데이터 로드 (시작 지연) 노드 방식 (table-all): 장점: 필요한 노드만 조회 (선택적 로드) 단점: 여러 노드에서 사용 시 중복 조회 권장: 데이터가 많으면 노드 방식, 재사용이 많으면 버튼 방식 ``` ## 로그 확인 ### 성공적인 실행 예시 ``` 📊 테이블 소스 노드 실행: orders, dataSourceType=context-data 📊 컨텍스트 데이터 사용: table-selection, 3건 ✅ 노드 실행 완료: 3건 처리 또는 📊 테이블 소스 노드 실행: customers, dataSourceType=table-all 📊 테이블 전체 데이터 조회: customers, 1,234건 ✅ 노드 실행 완료: 1,234건 처리 ``` ### 문제가 있는 경우 ``` ⚠️ context-data 모드이지만 전달된 데이터가 없습니다. 빈 배열 반환. 해결: 버튼의 controlDataSource 설정 확인 ``` ## 업데이트 내역 - **2025-01-24**: 백엔드 로직 개선 완료 - `executeTableSource()` 함수에 `dataSourceType` 처리 추가 - `executeExternalDBSource()` 함수에 `dataSourceType` 처리 추가 - 노드 설정이 올바르게 반영되도록 수정 - 일관성 있는 데이터 흐름 확립