# ๐Ÿ”ง 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 ์‚ฌ์šฉ ํ˜„ํ™ฉ ๋ถ„์„ ### ์ฃผ์š” ๊ธฐ๋Šฅ 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( `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 ์‹คํ–‰์˜ ํŠน์„ฑ์ƒ ์‹ ์ค‘ํ•œ ํ…Œ์ŠคํŠธ ํ•„์š”