diff --git a/PHASE4.1_ADMIN_CONTROLLER_MIGRATION.md b/PHASE4.1_ADMIN_CONTROLLER_MIGRATION.md new file mode 100644 index 00000000..6ebfd653 --- /dev/null +++ b/PHASE4.1_ADMIN_CONTROLLER_MIGRATION.md @@ -0,0 +1,385 @@ +# Phase 4.1: AdminController Raw Query ์ „ํ™˜ ๊ณ„ํš + +## ๐Ÿ“‹ ๊ฐœ์š” + +๊ด€๋ฆฌ์ž ์ปจํŠธ๋กค๋Ÿฌ์˜ Prisma ํ˜ธ์ถœ์„ Raw Query๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. +์‚ฌ์šฉ์ž, ํšŒ์‚ฌ, ๋ถ€์„œ, ๋ฉ”๋‰ด ๊ด€๋ฆฌ ๋“ฑ ํ•ต์‹ฌ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +### ๐Ÿ“Š ๊ธฐ๋ณธ ์ •๋ณด + +| ํ•ญ๋ชฉ | ๋‚ด์šฉ | +| --------------- | --------------------------------------------- | +| ํŒŒ์ผ ์œ„์น˜ | `backend-node/src/controllers/adminController.ts` | +| ํŒŒ์ผ ํฌ๊ธฐ | 2,571 ๋ผ์ธ | +| Prisma ํ˜ธ์ถœ | 28๊ฐœ | +| **ํ˜„์žฌ ์ง„ํ–‰๋ฅ ** | **0/28 (0%)** ๐Ÿ”„ **์ง„ํ–‰ ์˜ˆ์ •** | +| ๋ณต์žก๋„ | ์ค‘๊ฐ„ (๋‹ค์–‘ํ•œ CRUD ํŒจํ„ด) | +| ์šฐ์„ ์ˆœ์œ„ | ๐Ÿ”ด ๋†’์Œ (Phase 4.1) | +| **์ƒํƒœ** | โณ **๋Œ€๊ธฐ ์ค‘** | + +--- + +## ๐Ÿ” Prisma ํ˜ธ์ถœ ๋ถ„์„ + +### ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (13๊ฐœ) + +#### 1. getUserList (๋ผ์ธ 312-317) +```typescript +const totalCount = await prisma.user_info.count({ where }); +const users = await prisma.user_info.findMany({ where, skip, take, orderBy }); +``` +- **์ „ํ™˜**: count โ†’ `queryOne`, findMany โ†’ `query` +- **๋ณต์žก๋„**: ์ค‘๊ฐ„ (๋™์  WHERE, ํŽ˜์ด์ง•) + +#### 2. getUserInfo (๋ผ์ธ 419) +```typescript +const userInfo = await prisma.user_info.findFirst({ where }); +``` +- **์ „ํ™˜**: findFirst โ†’ `queryOne` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +#### 3. updateUserStatus (๋ผ์ธ 498) +```typescript +await prisma.user_info.update({ where, data }); +``` +- **์ „ํ™˜**: update โ†’ `query` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +#### 4. deleteUserByAdmin (๋ผ์ธ 2387) +```typescript +await prisma.user_info.update({ where, data: { is_active: 'N' } }); +``` +- **์ „ํ™˜**: update (soft delete) โ†’ `query` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +#### 5. getMyProfile (๋ผ์ธ 1468, 1488, 2479) +```typescript +const user = await prisma.user_info.findUnique({ where }); +const dept = await prisma.dept_info.findUnique({ where }); +``` +- **์ „ํ™˜**: findUnique โ†’ `queryOne` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +#### 6. updateMyProfile (๋ผ์ธ 1864, 2527) +```typescript +const updateResult = await prisma.user_info.update({ where, data }); +``` +- **์ „ํ™˜**: update โ†’ `queryOne` with RETURNING +- **๋ณต์žก๋„**: ์ค‘๊ฐ„ (๋™์  UPDATE) + +#### 7. createOrUpdateUser (๋ผ์ธ 1929, 1975) +```typescript +const savedUser = await prisma.user_info.upsert({ where, update, create }); +const userCount = await prisma.user_info.count({ where }); +``` +- **์ „ํ™˜**: upsert โ†’ `INSERT ... ON CONFLICT`, count โ†’ `queryOne` +- **๋ณต์žก๋„**: ๋†’์Œ + +#### 8. ๊ธฐํƒ€ findUnique (๋ผ์ธ 1596, 1832, 2393) +```typescript +const existingUser = await prisma.user_info.findUnique({ where }); +const currentUser = await prisma.user_info.findUnique({ where }); +const updatedUser = await prisma.user_info.findUnique({ where }); +``` +- **์ „ํ™˜**: findUnique โ†’ `queryOne` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +### ํšŒ์‚ฌ ๊ด€๋ฆฌ (7๊ฐœ) + +#### 9. getCompanyList (๋ผ์ธ 550, 1276) +```typescript +const companies = await prisma.company_mng.findMany({ orderBy }); +``` +- **์ „ํ™˜**: findMany โ†’ `query` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +#### 10. createCompany (๋ผ์ธ 2035) +```typescript +const existingCompany = await prisma.company_mng.findFirst({ where }); +``` +- **์ „ํ™˜**: findFirst (์ค‘๋ณต ์ฒดํฌ) โ†’ `queryOne` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +#### 11. updateCompany (๋ผ์ธ 2172, 2192) +```typescript +const duplicateCompany = await prisma.company_mng.findFirst({ where }); +const updatedCompany = await prisma.company_mng.update({ where, data }); +``` +- **์ „ํ™˜**: findFirst โ†’ `queryOne`, update โ†’ `queryOne` +- **๋ณต์žก๋„**: ์ค‘๊ฐ„ + +#### 12. deleteCompany (๋ผ์ธ 2261, 2281) +```typescript +const existingCompany = await prisma.company_mng.findUnique({ where }); +await prisma.company_mng.delete({ where }); +``` +- **์ „ํ™˜**: findUnique โ†’ `queryOne`, delete โ†’ `query` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +### ๋ถ€์„œ ๊ด€๋ฆฌ (2๊ฐœ) + +#### 13. getDepartmentList (๋ผ์ธ 1348) +```typescript +const departments = await prisma.dept_info.findMany({ where, orderBy }); +``` +- **์ „ํ™˜**: findMany โ†’ `query` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +#### 14. getDeptInfo (๋ผ์ธ 1488) +```typescript +const dept = await prisma.dept_info.findUnique({ where }); +``` +- **์ „ํ™˜**: findUnique โ†’ `queryOne` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +### ๋ฉ”๋‰ด ๊ด€๋ฆฌ (3๊ฐœ) + +#### 15. createMenu (๋ผ์ธ 1021) +```typescript +const savedMenu = await prisma.menu_info.create({ data }); +``` +- **์ „ํ™˜**: create โ†’ `queryOne` with INSERT RETURNING +- **๋ณต์žก๋„**: ์ค‘๊ฐ„ + +#### 16. updateMenu (๋ผ์ธ 1087) +```typescript +const updatedMenu = await prisma.menu_info.update({ where, data }); +``` +- **์ „ํ™˜**: update โ†’ `queryOne` with UPDATE RETURNING +- **๋ณต์žก๋„**: ์ค‘๊ฐ„ + +#### 17. deleteMenu (๋ผ์ธ 1149, 1211) +```typescript +const deletedMenu = await prisma.menu_info.delete({ where }); +// ์žฌ๊ท€ ์‚ญ์ œ +const deletedMenu = await prisma.menu_info.delete({ where }); +``` +- **์ „ํ™˜**: delete โ†’ `query` +- **๋ณต์žก๋„**: ์ค‘๊ฐ„ (์žฌ๊ท€ ์‚ญ์ œ ๋กœ์ง) + +### ๋‹ค๊ตญ์–ด (1๊ฐœ) + +#### 18. getMultiLangKeys (๋ผ์ธ 665) +```typescript +const result = await prisma.multi_lang_key_master.findMany({ where, orderBy }); +``` +- **์ „ํ™˜**: findMany โ†’ `query` +- **๋ณต์žก๋„**: ๋‚ฎ์Œ + +--- + +## ๐Ÿ“ ์ „ํ™˜ ์ „๋žต + +### 1๋‹จ๊ณ„: Import ๋ณ€๊ฒฝ +```typescript +// ์ œ๊ฑฐ +import { PrismaClient } from "@prisma/client"; +const prisma = new PrismaClient(); + +// ์ถ”๊ฐ€ +import { query, queryOne } from "../database/db"; +``` + +### 2๋‹จ๊ณ„: ๋‹จ์ˆœ ์กฐํšŒ ์ „ํ™˜ +- findMany โ†’ `query` +- findUnique/findFirst โ†’ `queryOne` + +### 3๋‹จ๊ณ„: ๋™์  WHERE ์ฒ˜๋ฆฌ +```typescript +const whereConditions: string[] = []; +const params: any[] = []; +let paramIndex = 1; + +if (companyCode) { + whereConditions.push(`company_code = $${paramIndex++}`); + params.push(companyCode); +} + +const whereClause = whereConditions.length > 0 + ? `WHERE ${whereConditions.join(' AND ')}` + : ''; +``` + +### 4๋‹จ๊ณ„: ๋ณต์žกํ•œ ๋กœ์ง ์ „ํ™˜ +- count โ†’ `SELECT COUNT(*) as count` +- upsert โ†’ `INSERT ... ON CONFLICT DO UPDATE` +- ๋™์  UPDATE โ†’ ์กฐ๊ฑด๋ถ€ SET ์ ˆ ์ƒ์„ฑ + +### 5๋‹จ๊ณ„: ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ +- ๊ฐ ํ•จ์ˆ˜๋ณ„ ๋™์ž‘ ํ™•์ธ +- ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ™•์ธ +- ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•์ธ + +--- + +## ๐ŸŽฏ ์ฃผ์š” ๋ณ€๊ฒฝ ์˜ˆ์‹œ + +### getUserList (count + findMany) +```typescript +// Before +const totalCount = await prisma.user_info.count({ where }); +const users = await prisma.user_info.findMany({ + where, + skip, + take, + orderBy +}); + +// After +const whereConditions: string[] = []; +const params: any[] = []; +let paramIndex = 1; + +// ๋™์  WHERE ๊ตฌ์„ฑ +if (where.company_code) { + whereConditions.push(`company_code = $${paramIndex++}`); + params.push(where.company_code); +} +if (where.user_name) { + whereConditions.push(`user_name ILIKE $${paramIndex++}`); + params.push(`%${where.user_name}%`); +} + +const whereClause = whereConditions.length > 0 + ? `WHERE ${whereConditions.join(' AND ')}` + : ''; + +// Count +const countResult = await queryOne<{ count: number }>( + `SELECT COUNT(*) as count FROM user_info ${whereClause}`, + params +); +const totalCount = parseInt(countResult?.count?.toString() || '0', 10); + +// ๋ฐ์ดํ„ฐ ์กฐํšŒ +const usersQuery = ` + SELECT * FROM user_info + ${whereClause} + ORDER BY created_date DESC + LIMIT $${paramIndex} OFFSET $${paramIndex + 1} +`; +params.push(take, skip); + +const users = await query(usersQuery, params); +``` + +### createOrUpdateUser (upsert) +```typescript +// Before +const savedUser = await prisma.user_info.upsert({ + where: { user_id: userId }, + update: updateData, + create: createData +}); + +// After +const savedUser = await queryOne( + `INSERT INTO user_info (user_id, user_name, email, ...) + VALUES ($1, $2, $3, ...) + ON CONFLICT (user_id) + DO UPDATE SET + user_name = EXCLUDED.user_name, + email = EXCLUDED.email, + ... + RETURNING *`, + [userId, userName, email, ...] +); +``` + +### updateMyProfile (๋™์  UPDATE) +```typescript +// Before +const updateResult = await prisma.user_info.update({ + where: { user_id: userId }, + data: updateData +}); + +// After +const updates: string[] = []; +const params: any[] = []; +let paramIndex = 1; + +if (updateData.user_name !== undefined) { + updates.push(`user_name = $${paramIndex++}`); + params.push(updateData.user_name); +} +if (updateData.email !== undefined) { + updates.push(`email = $${paramIndex++}`); + params.push(updateData.email); +} +// ... ๋‹ค๋ฅธ ํ•„๋“œ๋“ค + +params.push(userId); + +const updateResult = await queryOne( + `UPDATE user_info + SET ${updates.join(', ')}, updated_date = NOW() + WHERE user_id = $${paramIndex} + RETURNING *`, + params +); +``` + +--- + +## โœ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### ๊ธฐ๋ณธ ์„ค์ • +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ํƒ€์ž… import ํ™•์ธ + +### ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ +- [ ] getUserList (count + findMany) +- [ ] getUserInfo (findFirst) +- [ ] updateUserStatus (update) +- [ ] deleteUserByAdmin (soft delete) +- [ ] getMyProfile (findUnique x3) +- [ ] updateMyProfile (update x2) +- [ ] createOrUpdateUser (upsert + count) +- [ ] ๊ธฐํƒ€ findUnique (x3) + +### ํšŒ์‚ฌ ๊ด€๋ฆฌ +- [ ] getCompanyList (findMany x2) +- [ ] createCompany (findFirst ์ค‘๋ณต์ฒดํฌ) +- [ ] updateCompany (findFirst + update) +- [ ] deleteCompany (findUnique + delete) + +### ๋ถ€์„œ ๊ด€๋ฆฌ +- [ ] getDepartmentList (findMany) +- [ ] getDeptInfo (findUnique) + +### ๋ฉ”๋‰ด ๊ด€๋ฆฌ +- [ ] createMenu (create) +- [ ] updateMenu (update) +- [ ] deleteMenu (delete x2, ์žฌ๊ท€) + +### ๋‹ค๊ตญ์–ด +- [ ] getMultiLangKeys (findMany) + +### ๊ฒ€์ฆ +- [ ] TypeScript ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] Linter ์˜ค๋ฅ˜ ํ™•์ธ +- [ ] ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ +- [ ] ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ™•์ธ + +--- + +## ๐Ÿ“Œ ์ฐธ๊ณ ์‚ฌํ•ญ + +### ๋™์  ์ฟผ๋ฆฌ ์ƒ์„ฑ ํŒจํ„ด +๋ชจ๋“  ๋™์  WHERE/UPDATE๋Š” ๋‹ค์Œ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค: +1. ์กฐ๊ฑด/ํ•„๋“œ ๋ฐฐ์—ด ์ƒ์„ฑ +2. ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐฐ์—ด ์ƒ์„ฑ +3. ํŒŒ๋ผ๋ฏธํ„ฐ ์ธ๋ฑ์Šค ๊ด€๋ฆฌ +4. SQL ๋ฌธ์ž์—ด ์กฐํ•ฉ +5. query/queryOne ์‹คํ–‰ + +### ์—๋Ÿฌ ์ฒ˜๋ฆฌ +๊ธฐ์กด try-catch ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋Ÿฌ๋ฅผ ์ ์ ˆํžˆ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + +### ํŠธ๋žœ์žญ์…˜ +๋ณต์žกํ•œ ๋กœ์ง์€ Service Layer๋กœ ์ด๋™์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. + diff --git a/PHASE4_CONTROLLER_LAYER_MIGRATION.md b/PHASE4_CONTROLLER_LAYER_MIGRATION.md new file mode 100644 index 00000000..4bcc58e9 --- /dev/null +++ b/PHASE4_CONTROLLER_LAYER_MIGRATION.md @@ -0,0 +1,290 @@ +# Phase 4: Controller Layer Raw Query ์ „ํ™˜ ๊ณ„ํš + +## ๐Ÿ“‹ ๊ฐœ์š” + +์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด์— ๋‚จ์•„์žˆ๋Š” Prisma ํ˜ธ์ถœ์„ Raw Query๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. +๋Œ€๋ถ€๋ถ„์˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Service ๋ ˆ์ด์–ด๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ, ์ผ๋ถ€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง์ ‘ Prisma๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. + +--- + +### ๐Ÿ“Š ๊ธฐ๋ณธ ์ •๋ณด + +| ํ•ญ๋ชฉ | ๋‚ด์šฉ | +| --------------- | --------------------------------------- | +| ๋Œ€์ƒ ํŒŒ์ผ | 7๊ฐœ ์ปจํŠธ๋กค๋Ÿฌ | +| ํŒŒ์ผ ์œ„์น˜ | `backend-node/src/controllers/` | +| Prisma ํ˜ธ์ถœ | 70๊ฐœ | +| **ํ˜„์žฌ ์ง„ํ–‰๋ฅ ** | **0/70 (0%)** ๐Ÿ”„ **์ง„ํ–‰ ์˜ˆ์ •** | +| ๋ณต์žก๋„ | ์ค‘๊ฐ„ (๋Œ€๋ถ€๋ถ„ ๋‹จ์ˆœ CRUD) | +| ์šฐ์„ ์ˆœ์œ„ | ๐ŸŸก ์ค‘๊ฐ„ (Phase 4) | +| **์ƒํƒœ** | โณ **๋Œ€๊ธฐ ์ค‘** | + +--- + +## ๐ŸŽฏ ์ „ํ™˜ ๋Œ€์ƒ ์ปจํŠธ๋กค๋Ÿฌ + +### 1. adminController.ts (28๊ฐœ) +- **๋ผ์ธ ์ˆ˜**: 2,571 ๋ผ์ธ +- **Prisma ํ˜ธ์ถœ**: 28๊ฐœ +- **์ฃผ์š” ๊ธฐ๋Šฅ**: + - ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (์กฐํšŒ, ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ) + - ํšŒ์‚ฌ ๊ด€๋ฆฌ (์กฐํšŒ, ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ) + - ๋ถ€์„œ ๊ด€๋ฆฌ (์กฐํšŒ) + - ๋ฉ”๋‰ด ๊ด€๋ฆฌ (์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ) + - ๋‹ค๊ตญ์–ด ํ‚ค ์กฐํšŒ +- **์šฐ์„ ์ˆœ์œ„**: ๐Ÿ”ด ๋†’์Œ + +### 2. webTypeStandardController.ts (11๊ฐœ) +- **Prisma ํ˜ธ์ถœ**: 11๊ฐœ +- **์ฃผ์š” ๊ธฐ๋Šฅ**: ์›นํƒ€์ž… ํ‘œ์ค€ ๊ด€๋ฆฌ +- **์šฐ์„ ์ˆœ์œ„**: ๐ŸŸก ์ค‘๊ฐ„ + +### 3. fileController.ts (11๊ฐœ) +- **Prisma ํ˜ธ์ถœ**: 11๊ฐœ +- **์ฃผ์š” ๊ธฐ๋Šฅ**: ํŒŒ์ผ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ ๊ด€๋ฆฌ +- **์šฐ์„ ์ˆœ์œ„**: ๐ŸŸก ์ค‘๊ฐ„ + +### 4. buttonActionStandardController.ts (11๊ฐœ) +- **Prisma ํ˜ธ์ถœ**: 11๊ฐœ +- **์ฃผ์š” ๊ธฐ๋Šฅ**: ๋ฒ„ํŠผ ์•ก์…˜ ํ‘œ์ค€ ๊ด€๋ฆฌ +- **์šฐ์„ ์ˆœ์œ„**: ๐ŸŸก ์ค‘๊ฐ„ + +### 5. entityReferenceController.ts (4๊ฐœ) +- **Prisma ํ˜ธ์ถœ**: 4๊ฐœ +- **์ฃผ์š” ๊ธฐ๋Šฅ**: ์—”ํ‹ฐํ‹ฐ ์ฐธ์กฐ ๊ด€๋ฆฌ +- **์šฐ์„ ์ˆœ์œ„**: ๐ŸŸข ๋‚ฎ์Œ + +### 6. dataflowExecutionController.ts (3๊ฐœ) +- **Prisma ํ˜ธ์ถœ**: 3๊ฐœ +- **์ฃผ์š” ๊ธฐ๋Šฅ**: ๋ฐ์ดํ„ฐํ”Œ๋กœ์šฐ ์‹คํ–‰ +- **์šฐ์„ ์ˆœ์œ„**: ๐ŸŸข ๋‚ฎ์Œ + +### 7. screenFileController.ts (2๊ฐœ) +- **Prisma ํ˜ธ์ถœ**: 2๊ฐœ +- **์ฃผ์š” ๊ธฐ๋Šฅ**: ํ™”๋ฉด ํŒŒ์ผ ๊ด€๋ฆฌ +- **์šฐ์„ ์ˆœ์œ„**: ๐ŸŸข ๋‚ฎ์Œ + +--- + +## ๐Ÿ“ ์ „ํ™˜ ์ „๋žต + +### ๊ธฐ๋ณธ ์›์น™ + +1. **Service Layer ์šฐ์„ ** + - ๊ฐ€๋Šฅํ•˜๋ฉด Service๋กœ ๋กœ์ง ์ด๋™ + - Controller๋Š” ์ตœ์†Œํ•œ์˜ ๋กœ์ง๋งŒ ์œ ์ง€ + +2. **๋‹จ์ˆœ ์ „ํ™˜** + - ๋Œ€๋ถ€๋ถ„ ๋‹จ์ˆœ CRUD โ†’ `query`, `queryOne` ์‚ฌ์šฉ + - ๋ณต์žกํ•œ ๋กœ์ง์€ Service๋กœ ์ด๋™ + +3. **์—๋Ÿฌ ์ฒ˜๋ฆฌ ์œ ์ง€** + - ๊ธฐ์กด try-catch ๊ตฌ์กฐ ์œ ์ง€ + - ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ผ๊ด€์„ฑ ์œ ์ง€ + +### ์ „ํ™˜ ํŒจํ„ด + +#### 1. findMany โ†’ query +```typescript +// Before +const users = await prisma.user_info.findMany({ + where: { company_code: companyCode } +}); + +// After +const users = await query( + `SELECT * FROM user_info WHERE company_code = $1`, + [companyCode] +); +``` + +#### 2. findUnique โ†’ queryOne +```typescript +// Before +const user = await prisma.user_info.findUnique({ + where: { user_id: userId } +}); + +// After +const user = await queryOne( + `SELECT * FROM user_info WHERE user_id = $1`, + [userId] +); +``` + +#### 3. create โ†’ queryOne with INSERT +```typescript +// Before +const newUser = await prisma.user_info.create({ + data: userData +}); + +// After +const newUser = await queryOne( + `INSERT INTO user_info (user_id, user_name, ...) + VALUES ($1, $2, ...) RETURNING *`, + [userData.user_id, userData.user_name, ...] +); +``` + +#### 4. update โ†’ queryOne with UPDATE +```typescript +// Before +const updated = await prisma.user_info.update({ + where: { user_id: userId }, + data: updateData +}); + +// After +const updated = await queryOne( + `UPDATE user_info SET user_name = $1, ... + WHERE user_id = $2 RETURNING *`, + [updateData.user_name, ..., userId] +); +``` + +#### 5. delete โ†’ query with DELETE +```typescript +// Before +await prisma.user_info.delete({ + where: { user_id: userId } +}); + +// After +await query( + `DELETE FROM user_info WHERE user_id = $1`, + [userId] +); +``` + +#### 6. count โ†’ queryOne +```typescript +// Before +const count = await prisma.user_info.count({ + where: { company_code: companyCode } +}); + +// After +const result = await queryOne<{ count: number }>( + `SELECT COUNT(*) as count FROM user_info WHERE company_code = $1`, + [companyCode] +); +const count = parseInt(result?.count?.toString() || '0', 10); +``` + +--- + +## โœ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### Phase 4.1: adminController.ts +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ํ•จ์ˆ˜ ์ „ํ™˜ (8๊ฐœ) + - [ ] getUserList - count + findMany + - [ ] getUserInfo - findFirst + - [ ] updateUserStatus - update + - [ ] deleteUserByAdmin - update + - [ ] getMyProfile - findUnique + - [ ] updateMyProfile - update + - [ ] createOrUpdateUser - upsert + - [ ] count (getUserList) +- [ ] ํšŒ์‚ฌ ๊ด€๋ฆฌ ํ•จ์ˆ˜ ์ „ํ™˜ (7๊ฐœ) + - [ ] getCompanyList - findMany + - [ ] createCompany - findFirst (์ค‘๋ณต์ฒดํฌ) + create + - [ ] updateCompany - findFirst (์ค‘๋ณต์ฒดํฌ) + update + - [ ] deleteCompany - findUnique + delete +- [ ] ๋ถ€์„œ ๊ด€๋ฆฌ ํ•จ์ˆ˜ ์ „ํ™˜ (2๊ฐœ) + - [ ] getDepartmentList - findMany + - [ ] findUnique (๋ถ€์„œ ์กฐํšŒ) +- [ ] ๋ฉ”๋‰ด ๊ด€๋ฆฌ ํ•จ์ˆ˜ ์ „ํ™˜ (3๊ฐœ) + - [ ] createMenu - create + - [ ] updateMenu - update + - [ ] deleteMenu - delete +- [ ] ๊ธฐํƒ€ ํ•จ์ˆ˜ ์ „ํ™˜ (8๊ฐœ) + - [ ] getMultiLangKeys - findMany +- [ ] ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] ๋ฆฐํ„ฐ ํ™•์ธ + +### Phase 4.2: webTypeStandardController.ts +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ๋ชจ๋“  ํ•จ์ˆ˜ ์ „ํ™˜ (11๊ฐœ) +- [ ] ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] ๋ฆฐํ„ฐ ํ™•์ธ + +### Phase 4.3: fileController.ts +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ๋ชจ๋“  ํ•จ์ˆ˜ ์ „ํ™˜ (11๊ฐœ) +- [ ] ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] ๋ฆฐํ„ฐ ํ™•์ธ + +### Phase 4.4: buttonActionStandardController.ts +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ๋ชจ๋“  ํ•จ์ˆ˜ ์ „ํ™˜ (11๊ฐœ) +- [ ] ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] ๋ฆฐํ„ฐ ํ™•์ธ + +### Phase 4.5: entityReferenceController.ts +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ๋ชจ๋“  ํ•จ์ˆ˜ ์ „ํ™˜ (4๊ฐœ) +- [ ] ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] ๋ฆฐํ„ฐ ํ™•์ธ + +### Phase 4.6: dataflowExecutionController.ts +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ๋ชจ๋“  ํ•จ์ˆ˜ ์ „ํ™˜ (3๊ฐœ) +- [ ] ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] ๋ฆฐํ„ฐ ํ™•์ธ + +### Phase 4.7: screenFileController.ts +- [ ] Prisma import ์ œ๊ฑฐ +- [ ] query, queryOne import ์ถ”๊ฐ€ +- [ ] ๋ชจ๋“  ํ•จ์ˆ˜ ์ „ํ™˜ (2๊ฐœ) +- [ ] ์ปดํŒŒ์ผ ํ™•์ธ +- [ ] ๋ฆฐํ„ฐ ํ™•์ธ + +--- + +## ๐ŸŽฏ ์˜ˆ์ƒ ๊ฒฐ๊ณผ + +### ์ฝ”๋“œ ํ’ˆ์งˆ +- โœ… Prisma ์˜์กด์„ฑ ์™„์ „ ์ œ๊ฑฐ +- โœ… ์ง์ ‘์ ์ธ SQL ์ œ์–ด +- โœ… ํƒ€์ž… ์•ˆ์ „์„ฑ ์œ ์ง€ + +### ์„ฑ๋Šฅ +- โœ… ๋ถˆํ•„์š”ํ•œ ORM ์˜ค๋ฒ„ํ—ค๋“œ ์ œ๊ฑฐ +- โœ… ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๊ฐ€๋Šฅ + +### ์œ ์ง€๋ณด์ˆ˜์„ฑ +- โœ… ๋ช…ํ™•ํ•œ SQL ์ฟผ๋ฆฌ +- โœ… ๋””๋ฒ„๊น… ์šฉ์ด +- โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์šฉ์ด + +--- + +## ๐Ÿ“Œ ์ฐธ๊ณ ์‚ฌํ•ญ + +### Import ๋ณ€๊ฒฝ +```typescript +// Before +import { PrismaClient } from "@prisma/client"; +const prisma = new PrismaClient(); + +// After +import { query, queryOne } from "../database/db"; +``` + +### ํƒ€์ž… ์ •์˜ +- ๊ฐ ํ…Œ์ด๋ธ”์˜ ํƒ€์ž…์€ `types/` ๋””๋ ‰ํ† ๋ฆฌ์—์„œ import +- ํ•„์š”์‹œ ์ƒˆ๋กœ์šด ํƒ€์ž… ์ •์˜ ์ถ”๊ฐ€ + +### ์—๋Ÿฌ ์ฒ˜๋ฆฌ +- ๊ธฐ์กด try-catch ๊ตฌ์กฐ ์œ ์ง€ +- ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ ๋ฐ˜ํ™˜ +- ์‚ฌ์šฉ์ž ์นœํ™”์  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ + diff --git a/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md b/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md index 6ca6e9e2..fb91a3f5 100644 --- a/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md +++ b/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md @@ -152,18 +152,26 @@ backend-node/ (๋ฃจํŠธ) - `ddlExecutionService.ts` (0๊ฐœ) - โœ… **์ „ํ™˜ ์™„๋ฃŒ** (์ด๋ฏธ ์™„๋ฃŒ๋จ) - [๊ณ„ํš์„œ](PHASE3.18_DDL_EXECUTION_SERVICE_MIGRATION.md) - `referenceCacheService.ts` (0๊ฐœ) - โœ… **์ „ํ™˜ ์™„๋ฃŒ** (์ด๋ฏธ ์™„๋ฃŒ๋จ) - [๊ณ„ํš์„œ](PHASE3.17_REFERENCE_CACHE_SERVICE_MIGRATION.md) -#### ๐ŸŸข **๋‹จ์ˆœ (์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด) - 4์ˆœ์œ„** +#### ๐ŸŸข **์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด (Phase 4) - 4์ˆœ์œ„** -- `adminController.ts` (28๊ฐœ) - ๊ด€๋ฆฌ์ž ์ปจํŠธ๋กค๋Ÿฌ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `webTypeStandardController.ts` (11๊ฐœ) - ์›นํƒ€์ž… ํ‘œ์ค€ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `fileController.ts` (11๊ฐœ) - ํŒŒ์ผ ์ปจํŠธ๋กค๋Ÿฌ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `buttonActionStandardController.ts` (11๊ฐœ) - ๋ฒ„ํŠผ ์•ก์…˜ ํ‘œ์ค€ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `entityReferenceController.ts` (4๊ฐœ) - ์—”ํ‹ฐํ‹ฐ ์ฐธ์กฐ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `database.ts` (4๊ฐœ) - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • -- `dataflowExecutionController.ts` (3๊ฐœ) - ๋ฐ์ดํ„ฐํ”Œ๋กœ์šฐ ์‹คํ–‰ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `screenFileController.ts` (2๊ฐœ) - ํ™”๋ฉด ํŒŒ์ผ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `ddlRoutes.ts` (2๊ฐœ) - DDL ๋ผ์šฐํŠธ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ -- `companyManagementRoutes.ts` (2๊ฐœ) - ํšŒ์‚ฌ ๊ด€๋ฆฌ ๋ผ์šฐํŠธ โญ ์‹ ๊ทœ ๋ฐœ๊ฒฌ +**ํ†ตํ•ฉ ๊ณ„ํš์„œ**: [PHASE4_CONTROLLER_LAYER_MIGRATION.md](PHASE4_CONTROLLER_LAYER_MIGRATION.md) + +- `adminController.ts` (28๊ฐœ) - โณ **๋Œ€๊ธฐ ์ค‘** - [์ƒ์„ธ ๊ณ„ํš์„œ](PHASE4.1_ADMIN_CONTROLLER_MIGRATION.md) + - ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (13๊ฐœ), ํšŒ์‚ฌ ๊ด€๋ฆฌ (7๊ฐœ), ๋ถ€์„œ ๊ด€๋ฆฌ (2๊ฐœ), ๋ฉ”๋‰ด ๊ด€๋ฆฌ (3๊ฐœ), ๋‹ค๊ตญ์–ด (1๊ฐœ) +- `webTypeStandardController.ts` (11๊ฐœ) - โณ **๋Œ€๊ธฐ ์ค‘** + - findMany (1), findUnique (4), create (1), update (2), delete (1), $transaction (1), groupBy (1) +- `fileController.ts` (11๊ฐœ) - โณ **๋Œ€๊ธฐ ์ค‘** + - findMany (6), findUnique (4), create (1), update (1) +- `buttonActionStandardController.ts` (11๊ฐœ) - โณ **๋Œ€๊ธฐ ์ค‘** + - findMany (1), findUnique (4), create (1), update (2), delete (1), $transaction (1), groupBy (1) +- `entityReferenceController.ts` (4๊ฐœ) - โณ **๋Œ€๊ธฐ ์ค‘** +- `dataflowExecutionController.ts` (3๊ฐœ) - โณ **๋Œ€๊ธฐ ์ค‘** +- `screenFileController.ts` (2๊ฐœ) - โณ **๋Œ€๊ธฐ ์ค‘** + +**๊ธฐํƒ€ ์„ค์ • ํŒŒ์ผ**: +- `database.ts` (4๊ฐœ) - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ • ($connect, $disconnect) +- `ddlRoutes.ts` (2๊ฐœ) - DDL ๋ผ์šฐํŠธ +- `companyManagementRoutes.ts` (2๊ฐœ) - ํšŒ์‚ฌ ๊ด€๋ฆฌ ๋ผ์šฐํŠธ #### ๐Ÿ—‘๏ธ **์‚ญ์ œ ์˜ˆ์ • Scripts (๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋Œ€์ƒ ์•„๋‹˜)**