226 lines
6.6 KiB
Markdown
226 lines
6.6 KiB
Markdown
# 🎮 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. **트랜잭션 처리**
|
|
- 여러 테이블에 걸친 데이터 처리
|
|
3. **데이터 변환 및 매핑**
|
|
- 소스-타겟 데이터 변환
|
|
|
|
---
|
|
|
|
## 📝 전환 계획
|
|
|
|
### 1단계: 기본 조회 전환 (2개 함수)
|
|
|
|
**함수 목록**:
|
|
|
|
- `getRelationshipById()` - 관계 정보 조회
|
|
- `getDataflowConfig()` - 데이터플로우 설정 조회
|
|
|
|
### 2단계: 데이터 실행 로직 전환 (2개 함수)
|
|
|
|
**함수 목록**:
|
|
|
|
- `executeDataflow()` - 데이터플로우 실행
|
|
- `validateDataflow()` - 데이터플로우 검증
|
|
|
|
### 3단계: 복잡한 기능 - 트랜잭션 (2개 함수)
|
|
|
|
**함수 목록**:
|
|
|
|
- `executeWithTransaction()` - 트랜잭션 내 실행
|
|
- `rollbackOnError()` - 에러 시 롤백
|
|
|
|
---
|
|
|
|
## 💻 전환 예시
|
|
|
|
### 예시 1: 관계 정보 조회
|
|
|
|
```typescript
|
|
// 기존 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: 트랜잭션 내 실행
|
|
|
|
```typescript
|
|
// 기존 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` / `$executeRawUnsafe` → `query()`
|
|
3. **파라미터 바인딩 수정**: MySQL `?` → PostgreSQL `$1, $2...`
|
|
4. **복잡한 비즈니스 로직 유지**: 조건부 실행, 다중 커넥션, 에러 처리
|
|
|
|
## 🎯 완료 기준
|
|
|
|
- [x] **6개 모든 Prisma 호출을 Raw Query로 전환 완료** ✅
|
|
- [x] **모든 TypeScript 컴파일 오류 해결** ✅
|
|
- [x] **`import prisma` 완전 제거** ✅
|
|
- [ ] **트랜잭션 정상 동작 확인** ⏳
|
|
- [ ] **복잡한 비즈니스 로직 정상 동작** ⏳
|
|
- [ ] **모든 단위 테스트 통과 (10개)** ⏳
|
|
- [ ] **모든 통합 테스트 작성 완료 (4개 시나리오)** ⏳
|
|
- [ ] **성능 저하 없음** ⏳
|
|
|
|
---
|
|
|
|
## 💡 특이사항
|
|
|
|
### 복잡한 비즈니스 로직
|
|
|
|
이 서비스는 데이터플로우 제어라는 복잡한 비즈니스 로직을 처리합니다:
|
|
|
|
- 조건부 실행 로직
|
|
- 데이터 변환 및 매핑
|
|
- 트랜잭션 관리
|
|
- 에러 처리 및 롤백
|
|
|
|
### 성능 최적화 중요
|
|
|
|
데이터플로우 실행은 대량의 데이터를 처리할 수 있으므로:
|
|
|
|
- 배치 처리 고려
|
|
- 인덱스 활용
|
|
- 쿼리 최적화
|
|
|
|
---
|
|
|
|
**작성일**: 2025-09-30
|
|
**완료일**: 2025-10-01
|
|
**소요 시간**: 30분
|
|
**담당자**: 백엔드 개발팀
|
|
**우선순위**: 🟡 중간 (Phase 2.6)
|
|
**상태**: ✅ **전환 완료** (테스트 필요)
|
|
**특이사항**: 복잡한 비즈니스 로직이 포함되어 있어 신중한 테스트 필요
|