5.5 KiB
5.5 KiB
🎮 Phase 2.6: DataflowControlService Raw Query 전환 계획
📋 개요
DataflowControlService는 6개의 Prisma 호출이 있으며, 데이터플로우 제어 및 실행을 담당하는 서비스입니다.
📊 기본 정보
| 항목 | 내용 |
|---|---|
| 파일 위치 | backend-node/src/services/dataflowControlService.ts |
| 파일 크기 | 600+ 라인 |
| Prisma 호출 | 6개 |
| 현재 진행률 | 0/6 (0%) ⏳ 진행 예정 |
| 복잡도 | 높음 (복잡한 비즈니스 로직) |
| 우선순위 | 🟡 중간 (Phase 2.6) |
🎯 전환 목표
- ✅ 6개 모든 Prisma 호출을
db.ts의query()함수로 교체 - ✅ 복잡한 비즈니스 로직 정상 동작 확인
- ✅ 모든 단위 테스트 통과
- ✅ Prisma import 완전 제거
🔍 Prisma 사용 현황 분석
주요 기능
- 데이터플로우 실행 관리
- 관계 기반 데이터 조회 및 저장
- 조건부 실행 로직
- 트랜잭션 처리
- 여러 테이블에 걸친 데이터 처리
- 데이터 변환 및 매핑
- 소스-타겟 데이터 변환
📝 전환 계획
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개 시나리오)
- 데이터플로우 실행 시나리오
- 관계 조회 → 데이터 실행 → 로그 저장
- 트랜잭션 테스트
- 여러 테이블 동시 처리
- 에러 발생 시 롤백
- 조건부 실행 테스트
- 조건에 따른 데이터 처리
- 데이터 변환 테스트
- 소스-타겟 데이터 매핑
🎯 완료 기준
- 6개 모든 Prisma 호출을 Raw Query로 전환 완료
- 모든 TypeScript 컴파일 오류 해결
- 트랜잭션 정상 동작 확인
- 복잡한 비즈니스 로직 정상 동작
- 모든 단위 테스트 통과 (10개)
- 모든 통합 테스트 작성 완료 (4개 시나리오)
import prisma완전 제거 및import { query, transaction } from "../database/db"사용- 성능 저하 없음
💡 특이사항
복잡한 비즈니스 로직
이 서비스는 데이터플로우 제어라는 복잡한 비즈니스 로직을 처리합니다:
- 조건부 실행 로직
- 데이터 변환 및 매핑
- 트랜잭션 관리
- 에러 처리 및 롤백
성능 최적화 중요
데이터플로우 실행은 대량의 데이터를 처리할 수 있으므로:
- 배치 처리 고려
- 인덱스 활용
- 쿼리 최적화
작성일: 2025-09-30 예상 소요 시간: 1일 담당자: 백엔드 개발팀 우선순위: 🟡 중간 (Phase 2.6) 상태: ⏳ 진행 예정 특이사항: 복잡한 비즈니스 로직이 포함되어 있어 신중한 테스트 필요