{ "name": "Clean Code Rules", "description": "클린 코드 원칙을 따르기 위한 규칙", "rules": { "functions": { "maxLines": 20, "maxParameters": 3, "singleResponsibility": true, "naming": { "shouldBeVerb": true, "shouldBeDescriptive": true } }, "classes": { "maxMethods": 10, "maxProperties": 10, "singleResponsibility": true, "cohesion": "high" }, "variables": { "maxLength": 30, "shouldBeDescriptive": true, "avoidAbbreviations": true }, "comments": { "whenToUse": [ "복잡한 비즈니스 로직 설명", "API 문서화", "TODO 주석" ], "whenNotToUse": [ "자명한 코드 설명", "사용하지 않는 코드" ] }, "errorHandling": { "useCustomExceptions": true, "avoidNestedTryCatch": true, "logErrors": true }, "languageSpecific": { "typescript": { "interfaces": "명확한 책임을 가진 인터페이스 설계", "types": "가능한 한 구체적인 타입 사용 (any 지양)", "generics": "과도한 복잡성 없이 필요한 경우에만 사용", "nullHandling": "null/undefined를 명시적으로 처리", "enums": "연관된 상수 그룹에 열거형 사용", "asyncAwait": "Promise 체인보다 async/await 선호", "optionalChaining": "깊은 객체 접근 시 ?. 연산자 활용" }, "javascript": { "constUsage": "변경되지 않는 값에 const 사용", "letUsage": "변경이 필요한 값에만 let 사용 (var 지양)", "destructuring": "객체/배열 구조 분해 활용", "spreadOperator": "객체 복사/병합 시 전개 연산자 활용", "modules": "명확한 모듈 경계와 내보내기", "asyncOperations": "콜백 대신 Promise 또는 async/await 사용", "prototypeChain": "프로토타입 직접 수정 지양" }, "python": { "comprehensions": "적절한 경우 리스트/딕셔너리 컴프리헨션 사용", "generators": "대용량 데이터 처리 시 제너레이터 활용", "docstrings": "모든 함수/클래스에 독스트링 제공", "typeHints": "타입 힌트로 코드 명확성 향상", "contextManagers": "리소스 관리에 with문 활용", "namedTuples": "의미 있는 필드명이 필요한 튜플에 namedtuple 사용", "exceptions": "구체적인 예외 타입 사용 및 생성" } }, "codeComplexity": { "metrics": { "cyclomaticComplexity": { "description": "코드 내 독립적인 경로의 수를 측정", "maxValue": 10, "measurement": "if, else, switch, case, for, while, catch 등의 분기문 수" }, "cognitiveComplexity": { "description": "코드 이해 난이도 측정", "maxValue": 15, "factors": [ "중첩 구조 깊이", "분기 흐름 복잡도", "논리적 결합도" ] }, "maintainabilityIndex": { "description": "코드 유지보수성 측정", "minValue": 65, "calculation": "Halstead Volume, Cyclomatic Complexity, 코드 라인 수 기반" }, "depthOfInheritance": { "description": "클래스 상속 구조 깊이", "maxValue": 3 }, "fanOut": { "description": "한 모듈이 의존하는 다른 모듈의 수", "maxValue": 15 } }, "refactoringTriggers": [ "메서드 복잡도 기준 초과 시 분리 리팩터링", "함수 파라미터 3개 초과 시 객체 파라미터로 변경", "중첩 조건문 3단계 이상 시 조기 반환 패턴 적용", "코드 중복 발견 시 함수/클래스 추출" ], "tooling": { "static": ["ESLint", "SonarQube", "Pylint"], "runtime": ["console.time", "프로파일러"] } }, "architecturalPatterns": { "solid": { "singleResponsibility": { "description": "하나의 클래스는 하나의 책임만 가져야 함", "examples": [ "사용자 인증 로직과 사용자 프로필 로직 분리", "데이터 액세스 로직과 비즈니스 로직 분리" ] }, "openClosed": { "description": "확장에는 열려있고 수정에는 닫혀있어야 함", "examples": [ "전략 패턴을 통한 알고리즘 확장", "인터페이스를 통한 새 기능 추가" ] }, "liskovSubstitution": { "description": "하위 타입은 상위 타입을 대체할 수 있어야 함", "examples": [ "공통 인터페이스 구현 클래스들의 일관된 동작", "예외 발생 패턴 유지" ] }, "interfaceSegregation": { "description": "클라이언트는 사용하지 않는 인터페이스에 의존하지 않아야 함", "examples": [ "큰 인터페이스를 작은 인터페이스로 분리", "역할에 따른 인터페이스 분리" ] }, "dependencyInversion": { "description": "구체적인 것이 아닌 추상화에 의존해야 함", "examples": [ "의존성 주입을 통한 결합도 감소", "인터페이스를 통한 구현체 교체 용이성 확보" ] } }, "patterns": { "frontend": [ "컴포넌트 기반 아키텍처", "Flux/Redux 패턴", "컨테이너-프레젠테이션 패턴", "커스텀 훅을 통한 로직 재사용", "상태 관리 추상화 패턴" ], "backend": [ "계층형 아키텍처 (컨트롤러-서비스-리포지토리)", "헥사고날 아키텍처", "CQRS (명령 쿼리 책임 분리)", "이벤트 소싱", "마이크로서비스 패턴" ] }, "guidelines": [ "모듈 간 명확한 책임 경계 설정", "순환 의존성 제거", "적절한 추상화 수준 유지", "도메인 모델 중심 설계", "기술적 세부사항 은닉" ] }, "technicalDebt": { "identification": { "code": [ "TODO, FIXME 주석", "Magic Number/String", "과도한 복잡도 지표", "테스트 부재", "중복 코드" ], "design": [ "깨진 창문 패턴 (작은 결함 방치)", "과도한 클래스/모듈 의존성", "명확하지 않은 아키텍처 경계", "비일관적인 추상화 수준" ], "process": [ "문서화 부족", "자동화 테스트 부족", "품질 게이트 우회", "지속적인 통합/배포 부재" ] }, "management": { "tracking": { "method": "이슈 트래커에 기술 부채 항목 등록 및 추적", "labeling": "각 항목에 영향도, 복잡도, 우선순위 라벨 부여" }, "prioritization": [ "사용자 경험에 직접 영향을 미치는 항목 우선 처리", "신규 개발 효율성을 저해하는 항목 우선 처리", "보안 위험이 있는 항목 최우선 처리" ], "repayment": { "strategies": [ "Boy Scout Rule (항상 발견된 코드를 처음보다 깨끗하게 유지)", "기술 부채 상환 전용 스프린트 운영", "새 기능 개발 시 관련 영역 기술 부채 함께 해결" ], "budgeting": "개발 시간의 20-30%를 기술 부채 해결에 할당" } } } } }