# ๐Ÿ”Œ Phase 2.5: ExternalDbConnectionService Raw Query ์ „ํ™˜ ๊ณ„ํš ## ๐Ÿ“‹ ๊ฐœ์š” ExternalDbConnectionService๋Š” **15๊ฐœ์˜ Prisma ํ˜ธ์ถœ**์ด ์žˆ์œผ๋ฉฐ, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ### ๐Ÿ“Š ๊ธฐ๋ณธ ์ •๋ณด | ํ•ญ๋ชฉ | ๋‚ด์šฉ | | --------------- | ---------------------------------------------------------- | | ํŒŒ์ผ ์œ„์น˜ | `backend-node/src/services/externalDbConnectionService.ts` | | ํŒŒ์ผ ํฌ๊ธฐ | 1,100+ ๋ผ์ธ | | Prisma ํ˜ธ์ถœ | 0๊ฐœ (์ „ํ™˜ ์™„๋ฃŒ) | | **ํ˜„์žฌ ์ง„ํ–‰๋ฅ ** | **15/15 (100%)** โœ… **์™„๋ฃŒ** | | ๋ณต์žก๋„ | ์ค‘๊ฐ„ (CRUD + ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ) | | ์šฐ์„ ์ˆœ์œ„ | ๐ŸŸก ์ค‘๊ฐ„ (Phase 2.5) | | **์ƒํƒœ** | โœ… **์ „ํ™˜ ์™„๋ฃŒ ๋ฐ ์ปดํŒŒ์ผ ์„ฑ๊ณต** | ### ๐ŸŽฏ ์ „ํ™˜ ๋ชฉํ‘œ - โœ… 15๊ฐœ Prisma ํ˜ธ์ถœ์„ ๋ชจ๋‘ Raw Query๋กœ ์ „ํ™˜ - โœ… ๋ฏผ๊ฐ ์ •๋ณด ์•”ํ˜ธํ™” ์ฒ˜๋ฆฌ ์œ ์ง€ - โœ… ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ๋กœ์ง ์ •์ƒ ๋™์ž‘ - โœ… ๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ --- ## ๐Ÿ” ์ฃผ์š” ๊ธฐ๋Šฅ ### 1. ์™ธ๋ถ€ DB ์—ฐ๊ฒฐ ์ •๋ณด CRUD - ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ - ์—ฐ๊ฒฐ ์ •๋ณด ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ### 2. ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ - MySQL, PostgreSQL, MSSQL, Oracle ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ### 3. ์—ฐ๊ฒฐ ์ •๋ณด ๊ด€๋ฆฌ - ํšŒ์‚ฌ๋ณ„ ์—ฐ๊ฒฐ ์ •๋ณด ์กฐํšŒ - ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์ƒํƒœ ๊ด€๋ฆฌ --- ## ๐Ÿ“ ์˜ˆ์ƒ ์ „ํ™˜ ํŒจํ„ด ### CRUD ์ž‘์—… ```typescript // ์ƒ์„ฑ await query( `INSERT INTO external_db_connections (connection_name, db_type, host, port, database_name, username, password, company_code) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *`, [...] ); // ์กฐํšŒ await query( `SELECT * FROM external_db_connections WHERE company_code = $1 AND is_active = 'Y'`, [companyCode] ); // ์ˆ˜์ • await query( `UPDATE external_db_connections SET connection_name = $1, host = $2, ... WHERE connection_id = $2`, [...] ); // ์‚ญ์ œ (์†Œํ”„ํŠธ) await query( `UPDATE external_db_connections SET is_active = 'N' WHERE connection_id = $1`, [connectionId] ); ``` --- ## ๐Ÿ“‹ ์ „ํ™˜ ์™„๋ฃŒ ๋‚ด์—ญ ### โœ… ์ „ํ™˜๋œ ํ•จ์ˆ˜๋“ค (15๊ฐœ Prisma ํ˜ธ์ถœ) 1. **getConnections()** - ๋™์  WHERE ์กฐ๊ฑด ์ƒ์„ฑ์œผ๋กœ ์ „ํ™˜ 2. **getConnectionsGroupedByType()** - DB ํƒ€์ž… ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ 3. **getConnectionById()** - ๋‹จ์ผ ์—ฐ๊ฒฐ ์กฐํšŒ (๋น„๋ฐ€๋ฒˆํ˜ธ ๋งˆ์Šคํ‚น) 4. **getConnectionByIdWithPassword()** - ๋น„๋ฐ€๋ฒˆํ˜ธ ํฌํ•จ ์กฐํšŒ 5. **createConnection()** - ์ƒˆ ์—ฐ๊ฒฐ ์ƒ์„ฑ + ์ค‘๋ณต ํ™•์ธ 6. **updateConnection()** - ๋™์  ํ•„๋“œ ์—…๋ฐ์ดํŠธ 7. **deleteConnection()** - ๋ฌผ๋ฆฌ ์‚ญ์ œ 8. **testConnectionById()** - ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ์šฉ ์กฐํšŒ 9. **getDecryptedPassword()** - ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณตํ˜ธํ™”์šฉ ์กฐํšŒ 10. **executeQuery()** - ์ฟผ๋ฆฌ ์‹คํ–‰์šฉ ์กฐํšŒ 11. **getTables()** - ํ…Œ์ด๋ธ” ๋ชฉ๋ก ์กฐํšŒ์šฉ ### ๐Ÿ”ง ์ฃผ์š” ๊ธฐ์ˆ ์  ํ•ด๊ฒฐ ์‚ฌํ•ญ 1. **๋™์  WHERE ์กฐ๊ฑด ์ƒ์„ฑ**: ํ•„ํ„ฐ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ SQL ์ƒ์„ฑ 2. **๋™์  UPDATE ์ฟผ๋ฆฌ**: ๋ณ€๊ฒฝ๋œ ํ•„๋“œ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ๊ตฌํ˜„ 3. **ILIKE ๊ฒ€์ƒ‰**: ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†๋Š” ๊ฒ€์ƒ‰ ์ง€์› 4. **์•”ํ˜ธํ™” ๋กœ์ง ์œ ์ง€**: PasswordEncryption ํด๋ž˜์Šค์™€ ํ†ตํ•ฉ ์œ ์ง€ ## ๐ŸŽฏ ์™„๋ฃŒ ๊ธฐ์ค€ - [x] **15๊ฐœ Prisma ํ˜ธ์ถœ ๋ชจ๋‘ Raw Query๋กœ ์ „ํ™˜** โœ… - [x] **์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ๋กœ์ง ์ •์ƒ ๋™์ž‘** โœ… - [x] **์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์ •์ƒ ๋™์ž‘** โœ… - [ ] **๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ (10๊ฐœ ์ด์ƒ)** โณ - [x] **Prisma import ์™„์ „ ์ œ๊ฑฐ** โœ… - [x] **TypeScript ์ปดํŒŒ์ผ ์„ฑ๊ณต** โœ… --- **์ž‘์„ฑ์ผ**: 2025-09-30 **์™„๋ฃŒ์ผ**: 2025-10-01 **์†Œ์š” ์‹œ๊ฐ„**: 1์‹œ๊ฐ„ **๋‹ด๋‹น์ž**: ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœํŒ€ **์šฐ์„ ์ˆœ์œ„**: ๐ŸŸก ์ค‘๊ฐ„ (Phase 2.5) **์ƒํƒœ**: โœ… **์ „ํ™˜ ์™„๋ฃŒ** (ํ…Œ์ŠคํŠธ ํ•„์š”)