4.4 KiB
4.4 KiB
🔧 Phase 2.7: DDLExecutionService Raw Query 전환 계획
📋 개요
DDLExecutionService는 4개의 Prisma 호출이 있으며, DDL(Data Definition Language) 실행 및 관리를 담당하는 서비스입니다.
📊 기본 정보
| 항목 | 내용 |
|---|---|
| 파일 위치 | backend-node/src/services/ddlExecutionService.ts |
| 파일 크기 | 400+ 라인 |
| Prisma 호출 | 4개 |
| 현재 진행률 | 6/6 (100%) ✅ 완료 |
| 복잡도 | 중간 (DDL 실행 + 로그 관리) |
| 우선순위 | 🔴 최우선 (테이블 추가 기능 - Phase 2.3으로 변경) |
🎯 전환 목표
- ✅ 4개 모든 Prisma 호출을
db.ts의query()함수로 교체 - ✅ DDL 실행 정상 동작 확인
- ✅ 모든 단위 테스트 통과
- ✅ Prisma import 완전 제거
🔍 Prisma 사용 현황 분석
주요 기능
- DDL 실행
- CREATE TABLE, ALTER TABLE, DROP TABLE
- CREATE INDEX, DROP INDEX
- 실행 로그 관리
- DDL 실행 이력 저장
- 에러 로그 관리
- 롤백 지원
- DDL 롤백 SQL 생성 및 실행
📝 전환 계획
1단계: DDL 실행 전환 (2개 함수)
함수 목록:
executeDDL()- DDL 실행validateDDL()- DDL 문법 검증
2단계: 로그 관리 전환 (2개 함수)
함수 목록:
saveDDLLog()- 실행 로그 저장getDDLHistory()- 실행 이력 조회
💻 전환 예시
예시 1: DDL 실행 및 로그 저장
// 기존 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 실행 이력 조회
// 기존 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개 시나리오)
- 테이블 생성 → 로그 저장 → 이력 조회
- DDL 실행 실패 → 에러 로그 저장
- 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 실행의 특성상 신중한 테스트 필요