Reference

02. 메트릭 카탈로그

측정할 모든 메트릭의 정의, 연구 근거 논문, 계산 방법, 임계값

Source: docs/02-metrics-catalog.md

02. 메트릭 카탈로그

각 메트릭은 정의 → 연구 근거 → 계산 방법(빌드 없이) → 임계값 → finding 기록 방식 순으로 기술한다. 메트릭 ID는 <카테고리>-<번호> 형식이며 detail.csv의 metric_id 컬럼에 그대로 사용된다.

카테고리: SIZE(크기), CPLX(복잡도), ARCH(아키텍처/결합도), DUP(중복), SEC(보안), RES(자원/메모리), HYG(위생/잠재 위험)

현재 구현 상태는 jam metricsIMPL 컬럼이 원본이다. metrics v14.5.0 기준 카탈로그의 jam-lite 메트릭은 모두 구현되어 있다.

공통 점수 범위 근거 (metrics v14.5.0)

개별 룰은 아래 **근거** 블록의 정의·임계 근거를 따르고, 집계 모집단은 03-scoring-model.md §2.2를 따른다. 즉 production 파일의 CLOC만 사용하고, 카테고리의 구현된 룰이 지원하는 언어만 해당 카테고리의 eligible 분모에 포함한다. test/documentation/configuration/generated 및 미지원 언어 finding은 감사 출력에 보존하지만 점수에는 산입하지 않는다.

근거: ISO/IEC/IEEE 15939:2017(측정 정보 요구·범위·타당성), SonarSource *Setting the initial scope*(main/test 분리와 test의 source metrics/LOC 제외), SonarSource의 언어별 Quality Profile, El Emam et al.(2001, IEEE TSE)의 size confounding, Letouzey(2012, MTD@ICSE)의 SQALE remediation-cost density. 이 규칙은 룰이 보지 못하는 코드나 비제품 코드가 분모를 키워 점수를 인위적으로 올리지 못하게 한다.


SIZE — 크기 메트릭

SIZE-01: 파일 크기 (File CLOC)

SIZE-02: 함수 길이

SIZE-03: 매개변수 수

SIZE-04: God File / God Type (책임 집중)

SIZE-05: 사변적 일반화 (Speculative Generality) — opt-in


CPLX — 복잡도 메트릭

CPLX-01: 순환 복잡도 (Cyclomatic Complexity, CCN)

CPLX-02: 인지 복잡도 (Cognitive Complexity)

CPLX-03: 최대 중첩 깊이

CPLX-04: Halstead Volume / 난이도 (보조)

CPLX-05: 유지보수성 지수 (Maintainability Index, MI)

CPLX-06: 변경 핫스팟 (Change Hotspot) — opt-in

CHURN-01: 단명 코드율 (Short-Lived Code Ratio) — opt-in

CHURN-02: AI 귀속 커밋 비율 (AI-Attributed Commit Ratio) — opt-in

CHURN-03: 테스트 동반 변경율 (Test Co-Change Ratio) — opt-in

CHURN-04: 거대 일괄 커밋 (Oversized Batch Commit) — opt-in


ARCH — 아키텍처/결합도 메트릭

ARCH-01: 모듈 간 순환 의존 (Dependency Cycles)

ARCH-02: 파일 수준 순환 (같은 모듈 내)

ARCH-03: 불안정성/구심·원심 결합 (Fan-in / Fan-out, Instability)

ARCH-04: 디렉터리 구조 응집 (Orphan / Flat 구조)

ARCH-05: 허브형 의존 / God Component (Hub-Like Dependency)

ARCH-06: 변경 파급 비용 (Propagation Cost)

ARCH-07: 낮은 응집도 (LCOM4)

ARCH-08: 깊은 상속 (Deep Inheritance, DIT)

ARCH-09: 레이어 규칙 위반 (Layer Rule Violation)


DUP — 중복 코드

DUP-01: 토큰 기반 중복 블록 (Type-1/Type-2 클론)

DUP-02: 구조적 중복 (Type-3 근사, 선택)


SEC — 보안 메트릭 (정적 패턴 기반)

정밀 taint 분석은 비목표. AI가 자주 생성하는 명백한 취약 패턴을 AST 패턴 매칭으로 검출한다. 룰은 CWE ID와 매핑한다. 근거(총론): Pearce et al.(2022), *Asleep at the Keyboard? Assessing the Security of GitHub Copilot's Code Contributions*, IEEE S&P — AI 생성 코드의 ~40%가 취약 시나리오에서 CWE 해당. Perry et al.(2023), *Do Users Write More Insecure Code with AI Assistants?*, CCS — AI 보조 시 더 취약한 코드를 쓰면서 더 안전하다고 믿는 경향.

SEC-01: 하드코딩된 시크릿 (CWE-798)

SEC-02: 인젝션 위험 문자열 결합 (CWE-89/78/79/943)

SEC-03: 취약 암호/난수 (CWE-327/338)

SEC-04: 위험 역직렬화/동적 실행 (CWE-502/94)

SEC-05: 민감 정보 로깅/노출 (CWE-532)

SEC-06: 클라이언트 인젝션 / DOM XSS (CWE-79)

SEC-07: 경로 조작 / Path Traversal (CWE-22)

SEC-08: SSRF / 서버측 요청 위조 (CWE-918)


RES — 자원/메모리 관리

Go 도구이지만 대상 언어별 자원 관리 관용구를 점검한다. 정적 한계상 휴리스틱이며, 명백한 경우만 위반 처리.

RES-01: 자원 해제 누락

RES-02: 무한정 동시성/큐

RES-03: 전역 가변 상태

RES-04: 네트워크 타임아웃 부재


HYG — 위생/잠재 위험

HYG-01: 삼킨 예외 (빈 catch / 무시된 에러)

HYG-02: 죽은 코드

HYG-03: 방치된 표식 (TODO/FIXME/HACK/XXX)

HYG-04: 매직 넘버/매직 문자열 밀도

HYG-05: 주석 밀도 이상치

HYG-06: 테스트 부재 신호

HYG-07: 파스 실패 (Parse Failure)

바이브코딩 위생 지표(HYG-08~11, v12.1.0): 아래 4개는 AI 에이전트 산출물에서 특히 흔한 잔재를 잡기 위해 v12.1.0에서 추가됐다. 모두 외부 도구 없이 자체 구현한 라인/토큰 스캔이며 빌드 없이 여러 언어에 공통 적용된다. 산식/임계/가중치/캡은 바뀌지 않으므로(새 메트릭 추가) 기존 지표 점수는 불변이고, 16종 코퍼스 점수도 모두 그대로다(검증: best/stress 12종 직접 스캔, 나머지 4종은 SEC 상한으로 C 고정).

HYG-08: 주석 처리된 코드 (Commented-Out Code)

HYG-09: 미구현 스텁 (Unimplemented Stub)

HYG-10: 디버그 출력 잔재 (Leftover Debug Output)

HYG-11: 명명 규칙 비일관성 (Naming Convention Inconsistency)

HYG-12: 정적 검사기 억제 (Blanket Static-Check Suppression)

HYG-13: 단언 없는 테스트 (Assertion-Free Test)

HYG-14: 의존성 고정 위생 (Dependency Pinning Hygiene)

HYG-15: 잔여 플레이스홀더 (Placeholder Artifact)

HYG-16: 중복 설명 주석 (Redundant Comment)

HYG-17: 미해석 내부 import (Broken Internal Import)

HYG-18: 동어반복 테스트 (Tautological Test)


메트릭 ↔ README 요구사항 매핑

README 요구메트릭
하나의 파일이 너무 큼 (BIG CLOC)SIZE-01, SIZE-04
SOLID 위반 구조SIZE-04(SRP), ARCH-03(DIP/SDP), CPLX-02
모듈 간 순환 참조ARCH-01, ARCH-02
함수가 지나치게 복잡CPLX-01, CPLX-02, CPLX-03
중복 코드 비율DUP-01, DUP-02
보안 무시SEC-01 ~ SEC-08
메모리/자원 관리 엉망RES-01 ~ RES-03
잠재적 위험HYG-01 ~ HYG-12
주석 처리된 코드 / 미구현 스텁 / 디버그 잔재 / 명명 비일관성 / 검사기 억제 (바이브코딩 잔재)HYG-08, HYG-09, HYG-10, HYG-11, HYG-12

참고 문헌 (요약)

  1. McCabe, T. (1976). "A Complexity Measure." *IEEE TSE*.
  2. Halstead, M. (1977). *Elements of Software Science*. Elsevier.
  3. Basili, V. & Perricone, B. (1984). "Software Errors and Complexity." *CACM*.
  4. Oman, P. & Hagemeister, J. (1992); Coleman, D. et al. (1994). Maintainability Index. *IEEE Computer*.
  5. Chidamber, S. & Kemerer, C. (1994). "A Metrics Suite for Object Oriented Design." *IEEE TSE*.
  6. Martin, R. (1994/2002). Stability metrics (Ca/Ce/I). *Agile Software Development*.
  7. Baker, B. (1995). "On Finding Duplication and Near-Duplication in Large Software Systems." *WCRE*.
  8. Lakos, J. (1996). *Large-Scale C++ Software Design*. Addison-Wesley.
  9. Baxter, I. et al. (1998). "Clone Detection Using Abstract Syntax Trees." *ICSM*.
  10. Hovemeyer, D. & Pugh, W. (2004). "Finding Bugs is Easy." *OOPSLA*.
  11. Lanza, M. & Marinescu, R. (2006). *Object-Oriented Metrics in Practice*. Springer.
  12. MacCormack, A., Rusnak, J. & Baldwin, C. (2006). "Exploring the Structure of Complex Software Designs." *Management Science* (Propagation Cost — ARCH-06).
  13. Roy, C. & Cordy, J. (2007). "A Survey on Software Clone Detection Research."
  14. Hindle, A. et al. (2008). "Reading Beside the Lines: Indentation as a Proxy for Complexity Metrics." *ICPC*.
  15. Juergens, E. et al. (2009). "Do Code Clones Matter?" *ICSE*.
  16. Clements, P. et al. (2010). *Documenting Software Architectures: Views and Beyond*, 2nd ed. Addison-Wesley (Module viewtype/레이어드 뷰 — ARCH-09).
  17. Letouzey, J.-L. (2012). "The SQALE Method for Evaluating Technical Debt." *MTD Workshop*.
  18. Potdar, A. & Shihab, E. (2014). "An Exploratory Study on Self-Admitted Technical Debt." *ICSME*.
  19. Yuan, D. et al. (2014). "Simple Testing Can Prevent Most Critical Failures." *OSDI*.
  20. Arcelli Fontana, F., Pigazzini, I. et al. (2017). "Arcan: A Tool for Architectural Smells Detection." *ICSA* (Hub-Like Dependency — ARCH-05).
  21. Campbell, G. A. (2018). "Cognitive Complexity." SonarSource 백서.
  22. Pearce, H. et al. (2022). "Asleep at the Keyboard? Assessing the Security of GitHub Copilot's Code Contributions." *IEEE S&P*.
  23. Perry, N. et al. (2023). "Do Users Write More Insecure Code with AI Assistants?" *ACM CCS*.
  24. GitClear (2024). "Coding on Copilot: AI's Effect on Code Quality." 산업 보고서.
  25. MITRE CWE-770/CWE-400/CWE-362/CWE-561. Common Weakness Enumeration.
  26. ISO/IEC 25010:2023. *Systems and software engineering — Systems and software Quality Requirements and Evaluation (SQuaRE) — Product quality model* — maintainability/analysability.
  27. ISO/IEC/IEEE 29119. Software testing standards.
  28. SonarSource rule S109. "Magic numbers should not be used."
  29. SonarSource rule S125. "Sections of code should not be commented out." (HYG-08)
  30. SonarSource rule S3717. "Track uses of NotImplementedException." (HYG-09)
  31. MITRE CWE-489. Active Debug Code. (HYG-10)
  32. Deissenboeck, F. & Pizka, M. (2006). "Concise and consistent naming." *Software Quality Journal* 14(3). (HYG-11)
  33. SonarSource rule S1309. "@SuppressWarnings should not be used"; typescript-eslint ban-ts-comment; mypy warn_unused_ignores. (HYG-12)