1. 소프트웨어 품질 측정의 정량적 척도, 맥케이브 순환복잡도의 개요
가. 맥케이브 순환복잡도(McCabe’s Cyclomatic Complexity)의 정의
프로그램 소스 코드의 제어 흐름을 제어 흐름 그래프(Control Flow Graph)로 모델링하여, 소스 코드의 복잡도를 정량적으로 측정하는 대표적인 소프트웨어 공학적 지표.
화이트박스 테스트의 기법인 기본 경로 커버리지(Basis Path Coverage)의 기준이 되며, 프로그램 내에 존재하는 선형적으로 독립적인 경로(Independent Paths)의 수를 나타냄.
나. 순환복잡도의 핵심 목적 및 필요성
테스트 케이스 개수 산정: 기본 경로 테스트를 수행하기 위해 도출해야 하는 최소 테스트 케이스(TC) 수 결정.
유지보수 용이성 평가: 복잡도가 높은 소스 코드를 사전에 식별하여 리팩토링(Refactoring) 대상을 선정하는 기준선 제공.
2. 순환복잡도 산정을 위한 제어 흐름 그래프 구성 및 3대 계산 공식
가. 제어 흐름 그래프(Control Flow Graph)의 구성 요소
노드 (Node, $V$): 실행 가능한 명령문, 구문, 또는 순차적 코드 블록.
간선 (Edge, $E$): 제어의 흐름(조건 분기, 순차 실행 등)을 나타내는 노드 간의 연결선.
영역 (Region, $R$): 노드와 간선에 의해 둘러싸인 닫힌 공간과 그래프 외부의 열린 공간을 포함한 영역.
나. 순환복잡도($V(G)$) 측정을 위한 3가지 계산 공식
간선과 노드 기반 공식 (기본 공식):
$$V(G) = E - N + 2P$$($E$: 간선의 수, $N$: 노드의 수, $P$: 분리된 연결 성분의 수. 단일 프로그램의 경우 $P=1$이므로 보통 $V(G) = E - N + 2$ 적용)
술어 노드(Condition/Predicate Node) 기반 공식:
$$V(G) = P + 1$$($P$: 조건문, 반복문 등 제어가 분기되는 결정 노드/술어 노드의 개수)
영역(Region) 기반 공식:
$$V(G) = \text{그래프에 의해 분할된 평면 영역의 개수}(R)$$
3. 순환복잡도 계산 실무 적용 사례 (소스 코드 코드 분석)
다음과 같은 조건문이 포함된 가상의 자바스크립트/자바 코드를 기반으로 순환복잡도를 도출한다.
1: if (A > 10) {
2: if (B > 20) {
3: X = 1;
4: } else {
5: X = 2;
6: }
7: }
8: print(X);
가. 제어 흐름 그래프 매핑 및 공식 적용
노드($N$) 도출: [1, 2, 3, 4, 5, 6, 7, 8] $\rightarrow$ 총 8개 구문 단위로 그래프 매핑 시 복잡도 분석에 따라 가용 노드 가시화.
실제 계산 대입 (간단히 도해상 3대 공식 검증):
술어 노드($P$) 기준: 조건문 구문이
A > 10과B > 20으로 총 2개 존재함.공식 대입: $V(G) = P + 1 = 2 + 1 = 3$
결론: 해당 소스 코드를 100% 검증하기 위한 독립적인 기본 경로는 총 3개이며, 최소 3개의 테스트 케이스가 필요함.
4. 순환복잡도 지표 기반의 품질 위험도 관리 기준 및 활용 방안
가. 복잡도 레벨에 따른 위험도 가이드라인
| 순환복잡도 값 (V(G)) | 프로그램 상태 및 위험도 | 실무적 관리 대책 (Action Item) |
| 1 ~ 10 | 구조가 단순하고 안정적인 코드 | 안정적인 상태, 일반적인 테스트 수행 |
| 11 ~ 20 | 복잡해지기 시작하는 코드 | 구조 검토 요망, 테스트 케이스 상세 설계 필요 |
| 21 ~ 50 | 매우 복잡하여 위험성이 높은 코드 | 리팩토링(Refactoring) 필수 권고, 함수 분할 |
| 51 이상 | 비정상적이며 구조적 결함이 있는 코드 | 코드 재작성(Rewrite) 수준의 구조 개선 요구 |
나. 개발 전수 수명주기(SDLC)에서의 실무적 활용 방안
CI/CD 파이프라인 내 정적 분석 통합: SonarQube 등 정적 소스 코드 분석 도구를 빌드 파이프라인에 연동하여, 개발자가 작성한 소스 코드의 순환복잡도가 기준치(예: 10)를 초과할 경우 배포를 차단하는 Quality Gate 설정.
테스트 비용 및 일정 산정: 프로젝트 초기 모듈별 순환복잡도를 예측/측정하여, 복잡도가 높은 코어 모듈(예: 결제, 인증 로직)에 고급 테스트 인력을 전진 배치하고 화이트박스 테스트 공수(M/M)를 차별화하여 투입하는 리스크 기반 테스팅(RBT)의 근거로 활용.
댓글 없음:
댓글 쓰기