Files
vexplor/PHASE2.7_DDL_EXECUTION_MIGRATION.md

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.tsquery() 함수로 교체
  • 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 실행 및 로그 저장

// 기존 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개 시나리오)

  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 실행의 특성상 신중한 테스트 필요