VIBECODING 365 / DICTIONARY
코드 복잡도
Cyclomatic complexity
DEFINITION
코드 복잡도(code complexity)는, 실무에서 가장 자주 말하는 정량 지표로는 순환 복잡도(cyclomatic complexity)를 가리킨다. Sonar 가이드에 따르면 이 지표는 Thomas J. McCabe가 1976년에 제안한 소프트웨어 메트릭이다. 프로그램의 제어 흐름 그래프에서 선형 독립적인 실행 경로가 몇 개인지를 숫자로 나타낸다. 점수가 높을수록 실행 경로가 많고 이해·테스트·유지보수가 어려워지며, 낮을수록 상대적으로 단순한 흐름을 뜻한다. IEEE 논문의 요지는 복잡도가 코드의 물리적 길이가 아니라 결정 구조에 달려 있다는 것이다. McCabe의 원래 목적은 모듈이 얼마나 긴지가 아니라, 기초 경로 시험을 하려면 서로 다른 경로를 최소 몇 갈래 밟아야 하는지를 잡는 일이었다. 같은 줄 수라도 결정점이 많으면 점수가 올라가고, 직선에 가까운 긴 스크립트는 상대적으로 낮게 나올 수 있다.
길이가 아니라 갈래의 수
순환 복잡도는 파일이 몇 줄이냐가 아니라, 분기가 만들어 내는 서로 다른 경로가 몇 갈래인가에 가깝다. Sonar는 제어 흐름 그래프의 간선 수 E, 노드 수 N, 연결 성분 수 P로 C는 E 빼기 N 더하기 2P라고 설명한다. 단일 함수면 보통 P는 1이다. NIST의 구조화 시험 문서는 모듈마다 간선 빼기 노드 더하기 2로 같은 값을 둔다. if, while, for, switch 같은 조건과 반복은 각각 새 경로를 늘리므로 점수를 올린다. Sonar의 할인 판별 자바스크립트 예시는 간선 8, 노드 7, P 1로 C가 3이 되어, 테스트해야 할 독립 경로가 세 갈래임을 보여 준다.
린터가 함수마다 세는 방식
자바스크립트와 타입스크립트에서는 ESLint complexity 규칙이 같은 개념을 품질 게이트로 쓴다. 규칙은 함수, 그리고 클래스 필드 초기화와 static 블록처럼 암묵적 함수로 취급되는 단위의 순환 복잡도가 설정한 상한을 넘으면 경고한다. 기본 상한은 20이다. variant classic은 McCabe식이고, modified는 switch를 case 개수와 무관하게 1만 올린다. 선택적 체이닝, 기본 매개변수, 구조 분해 기본값, 논리 할당처럼 덜 눈에 띄는 분기도 경로로 잡힐 수 있다. 상한을 정할 수 없으면 이 규칙을 끄는 편이 낫다고 ESLint는 적는다.
점수만 깎는 쪼개기
에이전트가 기능을 한 함수에 몰아넣으면 조건과 예외, 특수 케이스가 한곳에 쌓여 순환 복잡도가 빠르게 오른다. Sonar가 정리한 쓰임은 유지보수 신호, 기초 경로 테스트에 필요한 최소 케이스 수 감각, 결함 위험 후보, 리뷰 우선순위다. 다만 분기는 적어도 길고 깊게 중첩된 코드는 여전히 어렵고, 이름과 구조, 인지 부담은 이 숫자만으로 안 잡힌다. 함수를 잘게 쪼개 점수만 낮추는 일도 가능하다. Sonar는 그래서 Cognitive Complexity 같은 보완 지표와 함께 보라고 한다. 그 지표는 경로 수보다 흐름을 따라가며 드는 이해 부담에 가깝다. 인지 복잡도에서는 같은 깊이의 분기를 더 무겁게 보고, switch의 여러 case를 한 덩어리로 취급하는 식의 차이를 둔다. 순환 복잡도가 낮아도 중첩이 깊으면 읽기 부담은 따로 남는다. 순환 복잡도는 이 함수를 더 쪼개거나 테스트를 보강할 시점인가를 묻는 경고등이지, 절대 등급표가 아니다. ESLint 기본 상한 20은 그 규칙의 기본값일 뿐, 모든 코드베이스의 합격선이 아니다.
ENGLISH
Cyclomatic complexity
EXAMPLE
ESLint complexity max 10
관련
이어서 볼 문서
RELATED TERMS
연관 용어
Refactoring
외부에서 관찰 가능한 동작(기능, API, 사용자 경험)을 변경하지 않으면서 코드의 내부 구조를 개선하는 체계적 작업이다. Martin Fowler의 1999년 저서 『Refactoring: Improving the Design of Existing Code』에서 체계화된 개념으로, 가독성 향상, 중복 제거, 복잡도 감소, 성능 개선, 테스트 용이성 향상 등을 목적으로 한다. 바이브 코딩에서 리팩토링은 특별한 의미를 가진다. AI가 초기에 생성한 코드는 기능적으로 동작하더라도 구조적으로 최적이 아닌 경우가 많으므로, AI와 협업하여 리팩토링을 수행하는 것이 일반적인 워크플로이다. 예를 들어, Claude Code에게 '이 컴포넌트를 더 작은 컴포넌트로 분리하고, 공통 로직을 커스텀 훅으로 추출해줘'와 같은 리팩토링 지시를 내릴 수 있다. 2026년 기준으로 AI 도구는 단일 서비스 내 리팩토링(파일 분할, 함수 추출, 타입 개선 등)은 잘 수행하지만, 마이크로서비스 간 크로스 시스템 리팩토링(서비스 경계 재정의, 데이터 모델 마이그레이션 등)은 아직 인간의 아키텍처 판단이 필수적인 영역이다.
code-quality 네이밍 컨벤션Naming convention
변수·함수·타입 이름을 팀이 정한 규칙으로 짓는 약속. TypeScript에서는 Google 스타일처럼 역할별 케이스로 읽기 비용을 줄인다.
javascript 함수Function
입력과 출력 관계가 분명한 작업을 이름 붙여 묶은 코드 단위. 정의와 호출이 다르며, 범위·클로저·화살표 함수가 함께 쓰인다.