대규모 레거시 .NET 코드베이스를 이해하기 위해 도구를 만들었다
Source: Dev.to
배경
저는 .NET 개발자이며, 최근에 제가 직접 만든 작은 도구들을 천천히 오픈소스로 공개하고 있습니다. 그 중 하나는 약 15년 된 대규모 레거시 .NET 4.6 애플리케이션(~1 M LOC)을 이해하는 데 도움을 주기 위해 만들었습니다.
문제점
코드만 읽는 것 이상으로 아키텍처를 파악할 방법이 필요했습니다:
- 무엇이 무엇에 의존하는가
- 잘못된 방향으로 흐르는 부분은 어디인가
- 숨겨진 순환 구조가 있는가
코드를 탐색하는 것은 가능하지만, 전체가 어떻게 연결되어 있는지 실질적인 그림을 얻기는 쉽지 않았습니다. 기존의 강력한 도구들은 비용이 많이 들고, 무료 도구들은 제 요구에 한계가 있었습니다.
초기 시도
직접 해결책을 만들 생각으로 실험을 해보았지만, 곧 포기했습니다. 다시 아이디어를 떠올렸을 때 몇 가지 실용적인 문제에 부딪혔습니다:
- SDK 차이
- MSBuild 해석 문제
- 프로젝트가 제대로 로드되지 않음
- 누락된 참조
결국 저는 코드를 디버깅하기보다 솔루션 로딩 과정을 디버깅하고 있음을 깨달았습니다. 로딩 단계가 안정화되니 나머지는 재미있는 작업이었습니다.
솔루션 개요
도구는 다음 단계들을 수행합니다:
- 솔루션 로드
- 의존성 매핑
- 브라우저에서 인터랙티브 그래프로 표시
- 순환 의존성 강조
추가 분석
깊이 파고들면서 몇 가지 빠른 체크를 추가했습니다:
- 순환 복잡도(Cyclomatic complexity)
- 사용되지 않는 공개 멤버(Dead code) 탐지
- 기본 결합도 지표
간단한 품질 게이트를 두어 임계값을 초과하면 CI에서 도구가 실패하도록 할 수 있습니다.
구현 세부 사항
- 대상 프레임워크: .NET 8
- 핵심 라이브러리: Roslyn (MSBuild workspace), MSBuildLocator
- 웹 서버: ASP.NET Core (임베디드)
- 시각화: D3.js
.NET 개발자인 저는 이를 .NET 글로벌 툴로 패키징했습니다.
dotnet tool install -g KiwiDepend
kiwi-dep analyze --solution MyApp.sln
사용법
kiwi-dep analyze 명령을 솔루션에 실행하면 인터랙티브 HTML 페이지가 생성되어 의존성 그래프를 시각화하고, 순환 구조를 강조하며, 위에서 언급한 추가 메트릭을 보고합니다.
결론
이 정도 규모의 코드베이스를 명확한 개요 없이 탐색하는 것은 고통스럽습니다. 이 도구는 가볍고 확장 가능한 방법으로 전체 개요를 제공하고, 아키텍처 문제를 조기에 발견하도록 도와줍니다.
유용하다고 생각되거나 직접 사용해 보고 싶다면, 저장소는 여기에서 확인할 수 있습니다:
https://github.com/KiwiDevelopment/KiwiDepend
레포에 ⭐ 하나만 눌러 주셔도 큰 힘이 됩니다! 🙂