# ๐ŸŽฎ 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( `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) **์ƒํƒœ**: โœ… **์ „ํ™˜ ์™„๋ฃŒ** (ํ…Œ์ŠคํŠธ ํ•„์š”) **ํŠน์ด์‚ฌํ•ญ**: ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ์‹ ์ค‘ํ•œ ํ…Œ์ŠคํŠธ ํ•„์š”