임팩트게이트: 인공지능이 더하는 구조적 부패를 점수로 매기는 도구
1. 이게 뭔가요?
임팩트게이트는 프로그래머가 소프트웨어 코드를 고칠 때 복잡하고 낡은 구조가 얼마나 더 늘어나는지 계산하고 이를 제한하는 개발 도구입니다. 프로그램 개발 과정에서 복잡한 구조가 계속 쌓이는 현상을 구조적 부패라고 부르며, 이 도구는 변경된 파일 수, 기존 코드의 복잡도, 코드 변경 규모 등을 수식으로 계산해 점수를 매깁니다. 이 점수가 기준치를 넘으면 경고를 보내거나 프로그램을 만드는 과정을 막습니다.
2. 왜 화제인가요?
프로젝트마다 언어나 규모가 달라서 고정된 숫자 기준 하나만 적용하기 어렵기 때문에 이 도구가 필요합니다. 개발팀이 수치를 직접 추측하지 않고도 프로젝트의 역사에 맞게 기준을 잡을 수 있도록 백분위수 등급을 매겨 변경 사항을 평가합니다. 설정 파일을 통해 경고와 차단 기준을 자유롭게 조절할 수 있으며 개발 환경에 맞추어 다양한 방식으로 활용할 수 있습니다.
3. 핵심 내용
이 도구는 내 컴퓨터에서 독립형 명령줄 도구로 실행할 수도 있고, 깃에 코드를 저장하기 전에 자동으로 검사하는 pre-commit hook으로 쓸 수도 있으며, 깃허브, 깃랩, 젠킨스 같은 지속적 통합 프로그램의 부가 기능인 플러그인으로 넣어서 쓸 수도 있습니다. 구조적 부패란 기존 프로그램 구조에 복잡한 내용이 자꾸 쌓여서 엉망이 되는 현상을 말하며, 거대한 함수나 거대한 클래스에 새로운 함수가 추가되는 식입니다. 임팩트게이트는 기준이 되는 원래 코드와 비교해 이번에 바뀐 내용이 얼마나 부담을 주는지 점수로 계산합니다. 영향도 점수 계산 공식은 impact = files_changed * Σ max(WMC_other, 1) * CC * Δlines 수식을 따릅니다. 여기서 WMC_other는 수정하려는 대상이 이미 담고 있던 복잡성 수치를 뜻합니다. 완전히 새로운 파일이나 클래스를 새로 만들어 가져오는 작업은 원래 그 자리에 아무것도 없었기 때문에 비용이 적게 듭니다. 하지만 이미 덩치가 크고 복잡한 클래스에 코드를 자꾸 덧붙이는 작업은 점수가 높게 나옵니다. 계산된 영향도 점수가 너무 높으면 이 도구는 코드 변경 내용을 더 단순하게 고치거나 건드린 코드를 정돈하라고 요구합니다. 단순하게 경고만 띄우거나 아예 프로그램을 만드는 과정을 중단시킬 수 있습니다. 파이썬 패키지 관리자인 pip 명령어를 이용해 pip install impact-gate로 설치하거나, 도커 이미지를 통해 바로 실행할 수 있습니다. 명령어는 현재 저장소에 임시로 올려둔 변경 사항과 마지막 기록을 비교하는 impact-gate score를 기본으로 사용하며, 아직 커밋하지 않은 내 컴퓨터 상의 모든 수정 사항을 검사하려면 impact-gate score --mode worktree를 사용하고, 자동화 시스템이나 다른 사람의 코드 검토 단계에서는 이미 기록된 가지와 기준 가지를 비교하는 impact-gate score --mode range --base origin/main --format json을 사용합니다. 종료 코드 0은 문제가 없거나 경고 수준이라 코드 변경이 허용됨을 뜻하고, 2는 영향도가 너무 높아 차단되었음을 뜻하며, 1은 사용법을 틀렸거나 실행 환경에 문제가 생겼음을 뜻합니다. 모든 검사 보고서에는 정돈이 필요한 파일 목록이 영향도가 큰 순서대로 나와서 부패가 어디에 집중되고 있는지 가리켜 줍니다. 어떤 소스 파일의 변경된 줄 수가 설정 파일에 적힌 최대치인 기본값 200,000줄보다 크다면 임팩트게이트는 이 파일을 검사 대상에서 제외하여 점수가 왜곡되거나 채점 속도가 느려지는 것을 막습니다. 깃 커밋 전용 검사 도구로 쓰려면 .git/hooks/pre-commit 파일을 설치하는 impact-gate install-hook 명령어를 사용합니다. 전체 분포 대비 해당 변경 사항이 어느 백분위수에 속하는지 평가하고 그 백분위수를 기준으로 통과 여부를 결정할 수 있으며, 이 명령어를 입력하면 프로젝트가 지금까지 거쳐 온 병합 기록을 바탕으로 해당 프로젝트만의 영향도 분포를 새로 만들거나 갱신합니다. 이 명령어는 점수 계산의 기준이 되는 정보가 담긴 .impact-gate-baseline.json 파일을 생성합니다. 이 등급은 도구와 함께 제공되는 기본 사전 데이터와 프로젝트 자체의 기준선 데이터를 서로 섞어서 계산합니다. 기본 사전 데이터는 공개된 오픈소스 저장소 20곳의 코드를 바탕으로 언어별 백분위수 표를 미리 만들어 둔 것이며, 프로젝트 자체의 기준선 데이터는 이미 합쳐진 메인 개발선을 따라가며 수집한 해당 저장소만의 변경 사항별 분포입니다. 두 데이터는 w = n / (n + K)라는 공식을 통해 섞이며, 여기서 n은 기준선 뒤로 실제로 합쳐진 변경 사항의 수이고 K는 기본 사전 데이터보다 프로젝트 자체의 기록을 더 신뢰하기 위해 필요한 과거 기록의 양을 뜻합니다. 저장소의 가장 최상위 폴더에 있는 .impact-gate.yml 파일을 통해 warn_at, block_at, enforcement, tolerance 등을 설정할 수 있습니다. 깃허브 액션에서는 fetch-depth: 0 설정이 반드시 필요하며, 깃랩 CI와 젠킨스에서도 도커 이미지를 사용하여 변경 사항의 점수를 매기고 보고서를 보관합니다.
4. 나에게 어떤 영향이 있나요?
개발자는 코드에 변경 사항을 반영하기 전에 도구를 실행해 자신이 추가한 복잡도를 미리 확인할 수 있습니다. 깃허브 액션이나 깃랩 같은 자동화 환경에 연동해 두면 기준을 초과하는 변경 사항이 코드 저장소에 합쳐지는 것을 자동으로 차단할 수 있습니다. 설정 파일에서 실행 방식을 처음에는 경고 모드로 시작해 점진적으로 적용하는 방식을 통해 안정적인 코드 관리가 가능합니다.