6.6 KiB
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.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 호출)
- executeDataflowControl() - 관계도 정보 조회 (findUnique → queryOne)
- evaluateActionConditions() - 대상 테이블 조건 확인 ($queryRawUnsafe → query)
- executeInsertAction() - INSERT 실행 ($executeRawUnsafe → query)
- executeUpdateAction() - UPDATE 실행 ($executeRawUnsafe → query)
- executeDeleteAction() - DELETE 실행 ($executeRawUnsafe → query)
- checkColumnExists() - 컬럼 존재 확인 ($queryRawUnsafe → query)
🔧 주요 기술적 해결 사항
- Prisma import 완전 제거:
import { query, queryOne } from "../database/db" - 동적 테이블 쿼리 전환:
$queryRawUnsafe/$executeRawUnsafe→query() - 파라미터 바인딩 수정: MySQL
?→ PostgreSQL$1, $2... - 복잡한 비즈니스 로직 유지: 조건부 실행, 다중 커넥션, 에러 처리
🎯 완료 기준
- 6개 모든 Prisma 호출을 Raw Query로 전환 완료 ✅
- 모든 TypeScript 컴파일 오류 해결 ✅
import prisma완전 제거 ✅- 트랜잭션 정상 동작 확인 ⏳
- 복잡한 비즈니스 로직 정상 동작 ⏳
- 모든 단위 테스트 통과 (10개) ⏳
- 모든 통합 테스트 작성 완료 (4개 시나리오) ⏳
- 성능 저하 없음 ⏳
💡 특이사항
복잡한 비즈니스 로직
이 서비스는 데이터플로우 제어라는 복잡한 비즈니스 로직을 처리합니다:
- 조건부 실행 로직
- 데이터 변환 및 매핑
- 트랜잭션 관리
- 에러 처리 및 롤백
성능 최적화 중요
데이터플로우 실행은 대량의 데이터를 처리할 수 있으므로:
- 배치 처리 고려
- 인덱스 활용
- 쿼리 최적화
작성일: 2025-09-30 완료일: 2025-10-01 소요 시간: 30분 담당자: 백엔드 개발팀 우선순위: 🟡 중간 (Phase 2.6) 상태: ✅ 전환 완료 (테스트 필요) 특이사항: 복잡한 비즈니스 로직이 포함되어 있어 신중한 테스트 필요