ERP-node/데이터소스_일관성_개선_완료.md

8.1 KiB

데이터 소스 일관성 개선 완료

문제점

기존에는 데이터 소스 설정이 일관성 없이 동작했습니다:

  • 테이블 위젯에서 선택한 행 → 노드는 선택된 행만 처리
  • 플로우 위젯에서 선택한 데이터 → 노드는 전체 테이블 조회 (예상과 다름)
  • 노드에 dataSourceType 설정이 있어도 백엔드가 무시

해결 방법

1. 백엔드 로직 개선

테이블 소스 노드 (내부 DB)

// 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 소스 노드

// 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 처리 추가
    • 노드 설정이 올바르게 반영되도록 수정
    • 일관성 있는 데이터 흐름 확립