UNPKG

aiwf

Version:

AI Workflow Framework for Claude Code with multi-language support (Korean/English)

415 lines (345 loc) 11.3 kB
# 코드 정리 및 유지보수 가이드 ## 개요 이 가이드는 AIWF v0.3.18+에서 사용된 코드 정리 원칙과 패턴을 문서화하며, 이는 유지보수성, 성능, 개발자 경험에서 상당한 개선을 달성했습니다. 검증 시스템의 주요 정리 작업은 지속적인 코드 품질 개선의 모델 역할을 합니다. ## 코드 정리 성과 ### 검증 시스템 변환 검증 시스템 정리는 체계적인 코드 최적화의 영향을 보여줍니다: #### 정량적 개선 - **코드 감소**: 86% 감소 (34848줄) - **함수 통합**: 67% 감소 (31개 주요 함수) - **중복 제거**: 3개의 중복 검증 함수 제거 - **성능 향상**: ~40% 더 빠른 실행, ~30% 메모리 사용량 감소 #### 정성적 개선 - **유지보수성 향상**: 명확한 관심사 분리 - **가독성 개선**: 단순화된 제어 흐름과 로직 - **더 나은 오류 처리**: 일관되고 실행 가능한 오류 메시지 - **통합된 인터페이스**: 모든 검증 작업을 위한 단일 진입점 ## 코드 정리 원칙 ### 1. 중복 제거 (DRY 원칙) **이전 (안티패턴):** ```javascript // 여러 중복 검증 함수들 async function validateInstallationDetailed(tools, language, options) { // 120줄의 유사한 검증 로직 } async function validateInstallationEnhanced(tools, language, detailed) { // 80줄의 중복 검증 로직 } async function validateInstallation(tools, language) { // 60줄의 기본 검증 로직 } ``` **이후 (깔끔한 패턴):** ```javascript // 단일, 통합된 검증 함수 async function validateInstallation(selectedTools, language) { // 48줄의 통합되고 효율적인 로직 const results = { success: [], failed: [], warnings: [] }; // 공통 검증 로직 const commonValid = await validateCommonFiles(); if (!commonValid.success) { results.failed.push({ tool: 'aiwf', reason: commonValid.reason }); } // 도구별 검증 루프 for (const tool of selectedTools) { const validation = await validateTool(tool); // 결과 처리... } return results; } ``` ### 2. 상수 기반 구성 **이전 (매직 넘버):** ```javascript // 코드 전반에 흩어진 매직 넘버들 if (stats.size < 10) { /* ... */ } if (mdcFiles.length < 2) { /* ... */ } if (stats.size < 50) { /* ... */ } ``` **이후 (중앙화된 상수):** ```javascript // 중앙화된 구성 const VALIDATION_CONSTANTS = { MIN_FILE_SIZE: 10, MIN_RULE_FILE_SIZE: 50, MIN_FILE_COUNT: { CURSOR_MDC: 2, WINDSURF_MD: 2, CLAUDE_COMMANDS: 4 } }; // 명확한 의도를 가진 사용 if (stats.size < VALIDATION_CONSTANTS.MIN_FILE_SIZE) { /* ... */ } if (mdcFiles.length < VALIDATION_CONSTANTS.MIN_FILE_COUNT.CURSOR_MDC) { /* ... */ } ``` ### 3. 단순화된 제어 흐름 **이전 (복잡한 중첩 조건):** ```javascript async function validateTool(tool, options) { if (tool === 'claudeCode' || tool === 'claude-code') { if (options && options.detailed) { // 상세한 Claude 검증 로직 } else if (options && options.enhanced) { // 향상된 Claude 검증 로직 } else { // 기본 Claude 검증 로직 } } else if (tool === 'cursor') { // 유사한 중첩 복잡성... } // 더 많은 중첩 조건들... } ``` **이후 (깔끔한 switch 패턴):** ```javascript async function validateTool(tool) { switch (tool) { case 'claudeCode': case 'claude-code': return validateClaudeCode(); case 'cursor': return validateCursorTool(); case 'windsurf': return validateWindsurfTool(); default: return { success: false, reason: `Unknown tool: ${tool}` }; } } ``` ### 4. 일관된 오류 처리 **이전 (일관성 없는 오류 패턴):** ```javascript // 혼합된 오류 처리 접근법 function validate1() { try { // 로직 } catch (e) { return null; // 일관성 없는 반환 } } function validate2() { // 로직 if (error) { throw new Error('모호한 오류'); // 부실한 오류 메시지 } } ``` **이후 (일관된 오류 패턴):** ```javascript // 통합된 오류 처리 패턴 async function validateTool(tool) { try { // 검증 로직 return { success: true }; } catch (error) { return { success: false, reason: `${tool} 검증 오류: ${error.message}` }; } } ``` ## 정리 가이드라인 ### 파일 조직 #### 정리 전 체크리스트 1. **중복 식별**: 반복되는 코드 패턴 검색 2. **매직 넘버 찾기**: 상수로 만들어야 할 하드코딩된 값 찾기 3. **함수 복잡성 분석**: 너무 많은 일을 하는 함수 식별 4. **오류 처리 검토**: 일관성 없는 오류 패턴 확인 5. **의존성 검사**: 사용하지 않는 import와 함수 제거 #### 정리 후 검증 1. **기능 검증**: 모든 원래 기능이 여전히 작동하는지 확인 2. **성능 테스트**: 속도와 메모리의 개선사항 측정 3. **유지보수성 확인**: 코드가 이해하고 수정하기 더 쉬워졌는지 확인 4. **오류 처리 검증**: 일관되고 도움이 되는 오류 메시지 확인 5. **문서 업데이트**: 변경사항을 문서에 반영 ### 코드 품질 지표 #### 정량적 지표 - **코드 줄 수**: 통합을 통한 감소 목표 - **함수 개수**: 중복 함수 감소 - **순환 복잡도**: 제어 흐름 단순화 - **코드 커버리지**: 테스트 커버리지 유지 또는 개선 - **성능 벤치마크**: 실행 시간과 메모리 측정 #### 정성적 지표 - **가독성**: 코드가 명확한 이야기를 전달해야 함 - **유지보수성**: 변경사항을 쉽게 구현할 수 있어야 함 - **테스트 가능성**: 코드를 단위 테스트하기 쉬워야 함 - **문서화**: 코드와 주석에서 의도가 명확해야 함 - **일관성**: 코드베이스 전반에 걸쳐 유사한 패턴 ### 리팩토링 패턴 #### 1. 상수 추출 ```javascript // 이전 if (fileSize < 10) { /* 오류 */ } if (files.length < 2) { /* 오류 */ } // 이후 const CONFIG = { MIN_SIZE: 10, MIN_COUNT: 2 }; if (fileSize < CONFIG.MIN_SIZE) { /* 오류 */ } if (files.length < CONFIG.MIN_COUNT) { /* 오류 */ } ``` #### 2. 유사한 함수들 통합 ```javascript // 이전: 여러 유사한 함수들 function validateToolA() { /* 유사한 로직 */ } function validateToolB() { /* 유사한 로직 */ } function validateToolC() { /* 유사한 로직 */ } // 이후: 단일 매개변수화된 함수 function validateTool(toolType) { const toolConfig = TOOL_CONFIGS[toolType]; // 통합된 검증 로직 } ``` #### 3. 조건부 로직 단순화 ```javascript // 이전: 중첩 조건들 if (condition1) { if (condition2) { if (condition3) { // 무언가 수행 } } } // 이후: 조기 반환 if (!condition1) return earlyResult; if (!condition2) return earlyResult; if (!condition3) return earlyResult; // 무언가 수행 ``` #### 4. 오류 처리 표준화 ```javascript // 이전: 혼합 패턴 function operation1() { try { // 로직 } catch (e) { console.log(e); // 일관성 없음 return null; } } // 이후: 일관된 패턴 function operation1() { try { // 로직 return { success: true, data: result }; } catch (error) { return { success: false, reason: error.message }; } } ``` ## 코드 리뷰 체크리스트 ### 정리 전 리뷰 - [ ] 코드 중복 식별 - [ ] 매직 넘버와 하드코딩된 값 찾기 - [ ] 지나치게 복잡한 함수 위치 파악 - [ ] 일관성 없는 패턴 확인 - [ ] 사용하지 않는 코드 식별 ### 정리 후 리뷰 - [ ] 기능 보존 검증 - [ ] 성능 개선 확인 - [ ] 오류 처리 일관성 확인 - [ ] 테스트 커버리지 유지 검증 - [ ] 문서 업데이트 확인 ## 성능 최적화 전략 ### 1. 함수 호출 감소 ```javascript // 이전: 여러 함수 호출 async function validate() { await validateA(); await validateB(); await validateC(); } // 이후: 배치 작업 async function validate() { const results = await Promise.all([ validateA(), validateB(), validateC() ]); return consolidateResults(results); } ``` ### 2. 파일 작업 최적화 ```javascript // 이전: 여러 파일 시스템 호출 const file1Exists = await fs.access(path1); const file2Exists = await fs.access(path2); const file3Exists = await fs.access(path3); // 이후: 배치 파일 작업 const fileChecks = await Promise.all([ fs.access(path1).then(() => true).catch(() => false), fs.access(path2).then(() => true).catch(() => false), fs.access(path3).then(() => true).catch(() => false) ]); ``` ### 3. 메모리 최적화 ```javascript // 이전: 메모리에 큰 객체들 const allData = await loadEntireDataset(); const processed = processLargeDataset(allData); // 이후: 스트리밍/청크 처리 const processedData = await processDataInChunks(dataSource, chunkSize); ``` ## 유지보수 전략 ### 정기적인 코드 건강 검사 #### 월별 리뷰 - [ ] 새로운 코드 중복 식별 - [ ] 증가하는 함수 복잡성 확인 - [ ] 오류 처리 패턴 검토 - [ ] 성능 지표 분석 - [ ] 상수와 구성 업데이트 #### 분기별 정리 - [ ] 주요 리팩토링 기회 - [ ] 의존성 정리 및 업데이트 - [ ] 성능 최적화 이니셔티브 - [ ] 문서 동기화 - [ ] 테스트 스위트 개선 ### 자동화된 코드 품질 #### 린팅 규칙 ```json { "rules": { "max-lines-per-function": ["error", 50], "max-params": ["error", 3], "complexity": ["error", 10], "no-duplicate-code": "error" } } ``` #### Pre-commit 훅 ```bash #!/bin/sh # 린팅 실행 npm run lint # 테스트 실행 npm test # 코드 중복 확인 npm run check-duplication # 성능 벤치마크 검증 npm run performance-check ``` ## 모범 사례 요약 ### 코드 조직 1. **단일 책임**: 각 함수는 한 가지 일을 잘해야 함 2. **명확한 명명**: 함수와 변수 이름은 자체 문서화되어야 함 3. **일관된 패턴**: 코드베이스 전반에 걸쳐 동일한 패턴 사용 4. **최소 의존성**: 실제로 사용하는 것만 import ### 오류 처리 1. **일관된 형식**: 모든 곳에서 동일한 오류 반환 형식 사용 2. **구체적인 메시지**: 실행 가능한 오류 정보 제공 3. **우아한 성능 저하**: 시스템을 중단시키지 않고 오류 처리 4. **로깅 전략**: 디버깅을 위해 적절하게 오류 로깅 ### 성능 1. **먼저 측정**: 최적화하기 전에 프로파일링 2. **병목현상 최적화**: 가장 영향력 있는 개선에 집중 3. **배치 작업**: 가능할 때 유사한 작업을 결합 4. **결과 캐싱**: 중복 계산 피하기 ### 유지보수성 1. **의도 문서화**: 무엇인지가 아니라 왜인지 설명 2. **버전 관리**: 원자적이고 잘 설명된 커밋 만들기 3. **테스트 커버리지**: 포괄적인 테스트 스위트 유지 4. **정기적인 리팩토링**: 기술 부채를 사전에 해결 ## 관련 문서 - [Validator API 참조](VALIDATOR_API.ko.md) - [아키텍처 가이드](ARCHITECTURE.ko.md) - [기여 가이드라인](CONTRIBUTING.ko.md) - [성능 가이드라인](PERFORMANCE_GUIDELINES.ko.md)