2025-09-30 17:40:21 +09:00
|
|
|
# 🔧 Phase 2.7: DDLExecutionService Raw Query 전환 계획
|
|
|
|
|
|
|
|
|
|
## 📋 개요
|
|
|
|
|
|
|
|
|
|
DDLExecutionService는 **4개의 Prisma 호출**이 있으며, DDL(Data Definition Language) 실행 및 관리를 담당하는 서비스입니다.
|
|
|
|
|
|
|
|
|
|
### 📊 기본 정보
|
|
|
|
|
|
|
|
|
|
| 항목 | 내용 |
|
|
|
|
|
| --------------- | -------------------------------------------------- |
|
|
|
|
|
| 파일 위치 | `backend-node/src/services/ddlExecutionService.ts` |
|
|
|
|
|
| 파일 크기 | 400+ 라인 |
|
|
|
|
|
| Prisma 호출 | 4개 |
|
2025-09-30 18:28:54 +09:00
|
|
|
| **현재 진행률** | **6/6 (100%)** ✅ **완료** |
|
2025-09-30 17:40:21 +09:00
|
|
|
| 복잡도 | 중간 (DDL 실행 + 로그 관리) |
|
2025-09-30 18:28:54 +09:00
|
|
|
| 우선순위 | 🔴 최우선 (테이블 추가 기능 - Phase 2.3으로 변경) |
|
2025-09-30 17:40:21 +09:00
|
|
|
|
|
|
|
|
### 🎯 전환 목표
|
|
|
|
|
|
|
|
|
|
- ✅ **4개 모든 Prisma 호출을 `db.ts`의 `query()` 함수로 교체**
|
|
|
|
|
- ✅ DDL 실행 정상 동작 확인
|
|
|
|
|
- ✅ 모든 단위 테스트 통과
|
|
|
|
|
- ✅ **Prisma import 완전 제거**
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 🔍 Prisma 사용 현황 분석
|
|
|
|
|
|
|
|
|
|
### 주요 기능
|
|
|
|
|
|
|
|
|
|
1. **DDL 실행**
|
|
|
|
|
- CREATE TABLE, ALTER TABLE, DROP TABLE
|
|
|
|
|
- CREATE INDEX, DROP INDEX
|
|
|
|
|
2. **실행 로그 관리**
|
|
|
|
|
- DDL 실행 이력 저장
|
|
|
|
|
- 에러 로그 관리
|
|
|
|
|
3. **롤백 지원**
|
|
|
|
|
- DDL 롤백 SQL 생성 및 실행
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 📝 전환 계획
|
|
|
|
|
|
|
|
|
|
### 1단계: DDL 실행 전환 (2개 함수)
|
|
|
|
|
|
|
|
|
|
**함수 목록**:
|
|
|
|
|
|
|
|
|
|
- `executeDDL()` - DDL 실행
|
|
|
|
|
- `validateDDL()` - DDL 문법 검증
|
|
|
|
|
|
|
|
|
|
### 2단계: 로그 관리 전환 (2개 함수)
|
|
|
|
|
|
|
|
|
|
**함수 목록**:
|
|
|
|
|
|
|
|
|
|
- `saveDDLLog()` - 실행 로그 저장
|
|
|
|
|
- `getDDLHistory()` - 실행 이력 조회
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 💻 전환 예시
|
|
|
|
|
|
|
|
|
|
### 예시 1: DDL 실행 및 로그 저장
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
// 기존 Prisma
|
|
|
|
|
await prisma.$executeRawUnsafe(ddlQuery);
|
|
|
|
|
|
|
|
|
|
await prisma.ddl_execution_log.create({
|
|
|
|
|
data: {
|
|
|
|
|
ddl_statement: ddlQuery,
|
|
|
|
|
execution_status: "SUCCESS",
|
|
|
|
|
executed_by: userId,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 전환 후
|
|
|
|
|
import { query } from "../database/db";
|
|
|
|
|
|
|
|
|
|
await query(ddlQuery);
|
|
|
|
|
|
|
|
|
|
await query(
|
|
|
|
|
`INSERT INTO ddl_execution_log
|
|
|
|
|
(ddl_statement, execution_status, executed_by, executed_date)
|
|
|
|
|
VALUES ($1, $2, $3, $4)`,
|
|
|
|
|
[ddlQuery, "SUCCESS", userId, new Date()]
|
|
|
|
|
);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 예시 2: DDL 실행 이력 조회
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
// 기존 Prisma
|
|
|
|
|
const history = await prisma.ddl_execution_log.findMany({
|
|
|
|
|
where: {
|
|
|
|
|
company_code: companyCode,
|
|
|
|
|
execution_status: "SUCCESS",
|
|
|
|
|
},
|
|
|
|
|
orderBy: { executed_date: "desc" },
|
|
|
|
|
take: 50,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 전환 후
|
|
|
|
|
import { query } from "../database/db";
|
|
|
|
|
|
|
|
|
|
const history = await query<DDLLog[]>(
|
|
|
|
|
`SELECT * FROM ddl_execution_log
|
|
|
|
|
WHERE company_code = $1
|
|
|
|
|
AND execution_status = $2
|
|
|
|
|
ORDER BY executed_date DESC
|
|
|
|
|
LIMIT $3`,
|
|
|
|
|
[companyCode, "SUCCESS", 50]
|
|
|
|
|
);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## ✅ 3단계: 테스트 & 검증
|
|
|
|
|
|
|
|
|
|
### 단위 테스트 (8개)
|
|
|
|
|
|
|
|
|
|
- [ ] executeDDL - CREATE TABLE
|
|
|
|
|
- [ ] executeDDL - ALTER TABLE
|
|
|
|
|
- [ ] executeDDL - DROP TABLE
|
|
|
|
|
- [ ] executeDDL - CREATE INDEX
|
|
|
|
|
- [ ] validateDDL - 문법 검증
|
|
|
|
|
- [ ] saveDDLLog - 로그 저장
|
|
|
|
|
- [ ] getDDLHistory - 이력 조회
|
|
|
|
|
- [ ] rollbackDDL - DDL 롤백
|
|
|
|
|
|
|
|
|
|
### 통합 테스트 (3개 시나리오)
|
|
|
|
|
|
|
|
|
|
1. **테이블 생성 → 로그 저장 → 이력 조회**
|
|
|
|
|
2. **DDL 실행 실패 → 에러 로그 저장**
|
|
|
|
|
3. **DDL 롤백 테스트**
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 🎯 완료 기준
|
|
|
|
|
|
|
|
|
|
- [ ] **4개 모든 Prisma 호출을 Raw Query로 전환 완료**
|
|
|
|
|
- [ ] **모든 TypeScript 컴파일 오류 해결**
|
|
|
|
|
- [ ] **DDL 실행 정상 동작 확인**
|
|
|
|
|
- [ ] **모든 단위 테스트 통과 (8개)**
|
|
|
|
|
- [ ] **모든 통합 테스트 작성 완료 (3개 시나리오)**
|
|
|
|
|
- [ ] **`import prisma` 완전 제거 및 `import { query } from "../database/db"` 사용**
|
|
|
|
|
- [ ] **성능 저하 없음**
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 💡 특이사항
|
|
|
|
|
|
|
|
|
|
### DDL 실행의 위험성
|
|
|
|
|
|
|
|
|
|
DDL은 데이터베이스 스키마를 변경하므로 매우 신중하게 처리해야 합니다:
|
|
|
|
|
|
|
|
|
|
- 실행 전 검증 필수
|
|
|
|
|
- 롤백 SQL 자동 생성
|
|
|
|
|
- 실행 이력 철저히 관리
|
|
|
|
|
|
|
|
|
|
### 트랜잭션 지원 제한
|
|
|
|
|
|
|
|
|
|
PostgreSQL에서 일부 DDL은 트랜잭션을 지원하지만, 일부는 자동 커밋됩니다:
|
|
|
|
|
|
|
|
|
|
- CREATE TABLE: 트랜잭션 지원 ✅
|
|
|
|
|
- DROP TABLE: 트랜잭션 지원 ✅
|
|
|
|
|
- CREATE INDEX CONCURRENTLY: 트랜잭션 미지원 ❌
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
**작성일**: 2025-09-30
|
|
|
|
|
**예상 소요 시간**: 0.5일
|
|
|
|
|
**담당자**: 백엔드 개발팀
|
|
|
|
|
**우선순위**: 🟢 낮음 (Phase 2.7)
|
|
|
|
|
**상태**: ⏳ **진행 예정**
|
|
|
|
|
**특이사항**: DDL 실행의 특성상 신중한 테스트 필요
|