231 lines
8.1 KiB
Markdown
231 lines
8.1 KiB
Markdown
# 데이터 소스 일관성 개선 완료
|
|
|
|
## 문제점
|
|
|
|
기존에는 데이터 소스 설정이 일관성 없이 동작했습니다:
|
|
|
|
- ❌ 테이블 위젯에서 선택한 행 → 노드는 선택된 행만 처리
|
|
- ❌ 플로우 위젯에서 선택한 데이터 → 노드는 **전체 테이블** 조회 (예상과 다름)
|
|
- ❌ 노드에 `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` 처리 추가
|
|
- 노드 설정이 올바르게 반영되도록 수정
|
|
- 일관성 있는 데이터 흐름 확립
|
|
|