diff --git a/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md b/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md index 78d45d71..08b041fc 100644 --- a/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md +++ b/PRISMA_TO_RAW_QUERY_MIGRATION_PLAN.md @@ -31,6 +31,7 @@ backend-node/src/services/ ├── dynamicFormService.ts # 동적 폼 (0개 호출) ✅ 전환 완료 ├── externalDbConnectionService.ts # 외부DB (0개 호출) ✅ 전환 완료 ├── dataflowControlService.ts # 제어관리 (0개 호출) ✅ 전환 완료 +├── multilangService.ts # 다국어 (0개 호출) ✅ 전환 완료 ├── ddlExecutionService.ts # DDL 실행 (6개 호출) ├── authService.ts # 인증 (5개 호출) └── multiConnectionQueryService.ts # 다중 연결 (4개 호출) @@ -121,7 +122,7 @@ backend-node/ (루트) #### 🟠 **복잡 (Raw Query 혼재) - 2순위** -- `multilangService.ts` (25개) - 재귀 쿼리, 다국어 처리 +- `multilangService.ts` (0개) - ✅ **전환 완료** (Phase 3.1) - `batchService.ts` (16개) - 배치 작업 관리 - `componentStandardService.ts` (16개) - 컴포넌트 표준 관리 - `commonCodeService.ts` (15개) - 코드 관리, 계층 구조 @@ -1128,7 +1129,14 @@ describe("Performance Benchmarks", () => { ### **Phase 3: 관리 기능 (2.5주) - 162개 호출** -- [ ] MultiLangService 전환 (25개) - 재귀 쿼리 +- [x] **MultiLangService 전환 (25개)** ✅ **완료** (Phase 3.1) + - [x] 25개 Prisma 호출 전환 완료 (다국어 관리 CRUD) + - [x] 동적 WHERE 조건 및 동적 UPDATE 쿼리 구현 + - [x] 트랜잭션 처리 (삭제 + 삽입) + - [x] JOIN 쿼리 (multi_lang_text + multi_lang_key_master) + - [x] IN 절 동적 파라미터 바인딩 + - [x] TypeScript 컴파일 성공 + - [x] Prisma import 완전 제거 - [ ] 배치 관련 서비스 전환 (40개) ⭐ 대규모 신규 발견 - [ ] BatchService (16개), BatchExternalDbService (8개) - [ ] BatchExecutionLogService (7개), BatchManagementService (5개) diff --git a/backend-node/src/services/multilangService.ts b/backend-node/src/services/multilangService.ts index 8d0ec43f..090065a3 100644 --- a/backend-node/src/services/multilangService.ts +++ b/backend-node/src/services/multilangService.ts @@ -288,9 +288,10 @@ export class MultiLangService { paramIndex++; } - const whereClause = whereConditions.length > 0 - ? `WHERE ${whereConditions.join(" AND ")}` - : ""; + const whereClause = + whereConditions.length > 0 + ? `WHERE ${whereConditions.join(" AND ")}` + : ""; const langKeys = await query<{ key_id: number; @@ -532,10 +533,9 @@ export class MultiLangService { // 트랜잭션으로 키와 연관된 텍스트 모두 삭제 await transaction(async (client) => { // 관련된 다국어 텍스트 삭제 - await client.query( - `DELETE FROM multi_lang_text WHERE key_id = $1`, - [keyId] - ); + await client.query(`DELETE FROM multi_lang_text WHERE key_id = $1`, [ + keyId, + ]); // 다국어 키 삭제 await client.query( @@ -618,10 +618,9 @@ export class MultiLangService { // 트랜잭션으로 기존 텍스트 삭제 후 새로 생성 await transaction(async (client) => { // 기존 텍스트 삭제 - await client.query( - `DELETE FROM multi_lang_text WHERE key_id = $1`, - [keyId] - ); + await client.query(`DELETE FROM multi_lang_text WHERE key_id = $1`, [ + keyId, + ]); // 새로운 텍스트 삽입 if (textData.texts.length > 0) { @@ -672,7 +671,14 @@ export class MultiLangService { AND mlkm.menu_name = $4 AND mlkm.lang_key = $5 AND mlkm.is_active = $6`, - [params.userLang, "Y", params.companyCode, params.menuCode, params.langKey, "Y"] + [ + params.userLang, + "Y", + params.companyCode, + params.menuCode, + params.langKey, + "Y", + ] ); if (!result) { @@ -765,8 +771,10 @@ export class MultiLangService { } // 모든 키에 대한 번역 조회 - const placeholders = params.langKeys.map((_, i) => `$${i + 4}`).join(", "); - + const placeholders = params.langKeys + .map((_, i) => `$${i + 4}`) + .join(", "); + const translations = await query<{ lang_text: string; lang_key: string; @@ -844,10 +852,9 @@ export class MultiLangService { }); // 언어 마스터 삭제 - await client.query( - `DELETE FROM language_master WHERE lang_code = $1`, - [langCode] - ); + await client.query(`DELETE FROM language_master WHERE lang_code = $1`, [ + langCode, + ]); }); logger.info("언어 삭제 완료", { langCode });