ERP-node/PHASE2.6_DATAFLOW_CONTROL_M...

6.6 KiB

🎮 Phase 2.6: DataflowControlService Raw Query 전환 계획

📋 개요

DataflowControlService는 6개의 Prisma 호출이 있으며, 데이터플로우 제어 및 실행을 담당하는 서비스입니다.

📊 기본 정보

항목 내용
파일 위치 backend-node/src/services/dataflowControlService.ts
파일 크기 1,100+ 라인
Prisma 호출 0개 (전환 완료)
현재 진행률 6/6 (100%) 완료
복잡도 높음 (복잡한 비즈니스 로직)
우선순위 🟡 중간 (Phase 2.6)
상태 전환 완료 및 컴파일 성공

🎯 전환 목표

  • 6개 모든 Prisma 호출을 db.tsquery() 함수로 교체
  • 복잡한 비즈니스 로직 정상 동작 확인
  • 모든 단위 테스트 통과
  • Prisma import 완전 제거

🔍 Prisma 사용 현황 분석

주요 기능

  1. 데이터플로우 실행 관리
    • 관계 기반 데이터 조회 및 저장
    • 조건부 실행 로직
  2. 트랜잭션 처리
    • 여러 테이블에 걸친 데이터 처리
  3. 데이터 변환 및 매핑
    • 소스-타겟 데이터 변환

📝 전환 계획

1단계: 기본 조회 전환 (2개 함수)

함수 목록:

  • getRelationshipById() - 관계 정보 조회
  • getDataflowConfig() - 데이터플로우 설정 조회

2단계: 데이터 실행 로직 전환 (2개 함수)

함수 목록:

  • executeDataflow() - 데이터플로우 실행
  • validateDataflow() - 데이터플로우 검증

3단계: 복잡한 기능 - 트랜잭션 (2개 함수)

함수 목록:

  • executeWithTransaction() - 트랜잭션 내 실행
  • rollbackOnError() - 에러 시 롤백

💻 전환 예시

예시 1: 관계 정보 조회

// 기존 Prisma
const relationship = await prisma.table_relationship.findUnique({
  where: { relationship_id: relationshipId },
  include: {
    source_table: true,
    target_table: true,
  },
});

// 전환 후
import { query } from "../database/db";

const relationship = await query<TableRelationship>(
  `SELECT 
    tr.*,
    st.table_name as source_table_name,
    tt.table_name as target_table_name
   FROM table_relationship tr
   LEFT JOIN table_labels st ON tr.source_table_id = st.table_id
   LEFT JOIN table_labels tt ON tr.target_table_id = tt.table_id
   WHERE tr.relationship_id = $1`,
  [relationshipId]
);

예시 2: 트랜잭션 내 실행

// 기존 Prisma
await prisma.$transaction(async (tx) => {
  // 소스 데이터 조회
  const sourceData = await tx.dynamic_form_data.findMany(...);

  // 타겟 데이터 저장
  await tx.dynamic_form_data.createMany(...);

  // 실행 로그 저장
  await tx.dataflow_execution_log.create(...);
});

// 전환 후
import { transaction } from "../database/db";

await transaction(async (client) => {
  // 소스 데이터 조회
  const sourceData = await client.query(
    `SELECT * FROM dynamic_form_data WHERE ...`,
    [...]
  );

  // 타겟 데이터 저장
  await client.query(
    `INSERT INTO dynamic_form_data (...) VALUES (...)`,
    [...]
  );

  // 실행 로그 저장
  await client.query(
    `INSERT INTO dataflow_execution_log (...) VALUES (...)`,
    [...]
  );
});

5단계: 테스트 & 검증

단위 테스트 (10개)

  • getRelationshipById - 관계 정보 조회
  • getDataflowConfig - 설정 조회
  • executeDataflow - 데이터플로우 실행
  • validateDataflow - 검증
  • executeWithTransaction - 트랜잭션 실행
  • rollbackOnError - 에러 처리
  • transformData - 데이터 변환
  • mapSourceToTarget - 필드 매핑
  • applyConditions - 조건 적용
  • logExecution - 실행 로그

통합 테스트 (4개 시나리오)

  1. 데이터플로우 실행 시나리오
    • 관계 조회 → 데이터 실행 → 로그 저장
  2. 트랜잭션 테스트
    • 여러 테이블 동시 처리
    • 에러 발생 시 롤백
  3. 조건부 실행 테스트
    • 조건에 따른 데이터 처리
  4. 데이터 변환 테스트
    • 소스-타겟 데이터 매핑

📋 전환 완료 내역

전환된 함수들 (6개 Prisma 호출)

  1. executeDataflowControl() - 관계도 정보 조회 (findUnique → queryOne)
  2. evaluateActionConditions() - 대상 테이블 조건 확인 ($queryRawUnsafe → query)
  3. executeInsertAction() - INSERT 실행 ($executeRawUnsafe → query)
  4. executeUpdateAction() - UPDATE 실행 ($executeRawUnsafe → query)
  5. executeDeleteAction() - DELETE 실행 ($executeRawUnsafe → query)
  6. checkColumnExists() - 컬럼 존재 확인 ($queryRawUnsafe → query)

🔧 주요 기술적 해결 사항

  1. Prisma import 완전 제거: import { query, queryOne } from "../database/db"
  2. 동적 테이블 쿼리 전환: $queryRawUnsafe / $executeRawUnsafequery()
  3. 파라미터 바인딩 수정: MySQL ? → PostgreSQL $1, $2...
  4. 복잡한 비즈니스 로직 유지: 조건부 실행, 다중 커넥션, 에러 처리

🎯 완료 기준

  • 6개 모든 Prisma 호출을 Raw Query로 전환 완료
  • 모든 TypeScript 컴파일 오류 해결
  • import prisma 완전 제거
  • 트랜잭션 정상 동작 확인
  • 복잡한 비즈니스 로직 정상 동작
  • 모든 단위 테스트 통과 (10개)
  • 모든 통합 테스트 작성 완료 (4개 시나리오)
  • 성능 저하 없음

💡 특이사항

복잡한 비즈니스 로직

이 서비스는 데이터플로우 제어라는 복잡한 비즈니스 로직을 처리합니다:

  • 조건부 실행 로직
  • 데이터 변환 및 매핑
  • 트랜잭션 관리
  • 에러 처리 및 롤백

성능 최적화 중요

데이터플로우 실행은 대량의 데이터를 처리할 수 있으므로:

  • 배치 처리 고려
  • 인덱스 활용
  • 쿼리 최적화

작성일: 2025-09-30 완료일: 2025-10-01 소요 시간: 30분 담당자: 백엔드 개발팀 우선순위: 🟡 중간 (Phase 2.6) 상태: 전환 완료 (테스트 필요) 특이사항: 복잡한 비즈니스 로직이 포함되어 있어 신중한 테스트 필요