소스코드의 품질 특성을 정량적으로 측정하는 지표 (Source Code Metric)

정적 테스트의 수단 중 하나. 도구가 코드를 스캔하여 규모·복잡도·의존성·테스트·정적분석·출시·결함의 지표를 산출한다. 코드 품질을 주관 평가가 아닌 측정 가능한 수치로 판단하여 리팩토링·품질 게이트의 근거로 삼는다.

제품 품질 메트릭 taxonomy

범주대표 지표
규모 관련LOC · NLOC · 주석 비율 · 함수·파일·패키지별 라인 수
복잡도 관련순환 복잡도 · 인지 복잡도 (Cognitive Complexity)
테스트 관련기능 커버리지 · 함수 커버리지 · 문장·분기·MCDC 커버리지
의존성 관련함수별 호출 수 · 피호출 수 · 변경 영향 비율 (Stability) · 상호 참조 비율
정적분석 관련MISRA 룰 위반 수 (→ 정적 분석 · 코딩 표준)
출시 관련출시 후 결함 수
결함 관련소스코드 라인 대비 결함 비율 · 유형별·원인별 결함 비율

규모 관련 메트릭

메트릭정의
LOCLine of Code — 전체 코드 라인 수
NLOCNon-Comment Lines of Code — 주석 제외
주석 비율전체 라인 중 주석 비율
  • 함수 단위·파일 단위·패키지 단위로 각각 측정
  • 자동차 도메인은 HIS 메트릭의 함수당 명령어 수(STMT, 기준범위 1~50, 방위사업청 200 이하)로 함수 길이를 제한
  • HIS Source Code Metrics

복잡도 관련 메트릭

순환 복잡도 (Cyclomatic Complexity)

함수의 제어 흐름이 얼마나 복잡한지 측정. 분기문마다 +1. 상세는 순환 복잡도.

인지 복잡도 (Cognitive Complexity)

함수가 얼마나 중첩되어 있는지 측정. Nesting Depth라고도 부름.

  • 순환 복잡도는 분기 에, 인지 복잡도는 분기의 깊이에 가중치
  • 같은 순환 복잡도 값이라도 중첩이 깊으면 사람이 이해하기 더 어려움
  • SonarQube 등 일부 도구가 별도 지표로 제공

의존성 관련 메트릭

메트릭의미
호출 수 (Calling)한 함수가 다른 함수를 호출하는 건수
피호출 수 (Calls)한 함수가 다른 함수로부터 호출되는 건수
변경 영향 비율 (Stability)한 함수가 변경되면 전체 코드의 몇 %가 영향받는가
상호 참조 비율상호 호출 관계가 있는 파일이 있는가 (변경 영향도 파악 목적)

도구 기반 호출 관계 분석은 정적 분석의 의존성 분석 참조.

HIS Hersteller Initiative Software 메트릭

자동차 업계 OEM 공동의 코드 메트릭 기준. 함수 단위 코드 품질을 정량화하며 COMF·PATH·GOTO·v(G)·CALLING·CALLS·PARAM·STMT·LEVEL·RETURN 9지표로 구성된다. 상세 표와 방위사업청 기준 비교는 HIS Source Code Metrics.

코드 품질 측정의 의의

코드 품질을 측정하는 유일한 척도 = 분당 내지르는 WTF! 횟수

주관적 농담이지만 가독성·유지보수성이 측정의 본질임을 드러냄. 정량 메트릭은 이를 대리하는 수단으로 리팩토링 판단의 근거가 된다.

메트릭 측정 자동화

제품 품질 메트릭은 최대한 자동화하는 것이 필요

자동화의 의미 — 도구가 지정한 주기별로 측정·보고하고, 목표 위반 시 Alert 발생.

자동화 가능 범주: 규모·의존성·복잡도·테스트·정적분석 관련. 자동차 전장에 필수 사용하는 테스트·정적분석 도구에서 모두 측정 가능.

테스트 자동화는 테스트 케이스 개발의 자동화가 아니라 테스트 수행의 자동화. 케이스는 사람이 만들고 수행은 컴퓨터가 한다.

Jenkins 기반 CI에 메트릭 도구를 플러그인하면 커밋 시마다 지표 산출·게시가 자동화된다.

실습 도구

Lizard — 복잡도·규모 측정

  • Python 기반 오픈소스. pip install lizard
  • 분석 지표: 순환 복잡도, NLOC, 함수 매개변수 수
  • 명령줄 예: lizard.exe -C 10 --csv > result.csv — 복잡도 10 이상 함수만 CSV 출력
  • 홈페이지: https://pypi.org/project/lizard/
  • 언제 쓰는가: 복잡해서 이해도·유지보수성을 저해하는 코드 확인 시

CPD — 중복 코드 측정

  • PMD(Java 기반 정적 분석 도구)의 부가 도구. 대부분의 개발 언어 지원
  • 분석 지표: 지정 Token 수 이상의 중복 코드 블록
  • 명령줄 예: cpd.bat --minimum-tokens 100 --files . --language cpp --format csv > result.csv
  • 홈페이지: https://pmd.github.io/
  • 언제 쓰는가: 중복 코드·불필요한 재사용 확인 시 (→ 중복 코드 리팩토링)

같이 보기