
말뿐인 아키텍처 문서는 가라! ArchUnit과 CI로 신규 위반 0건을 달성한 우아한형제들의 실전 전환기
아무리 꼼꼼히 문서를 작성하고 코드 리뷰를 해도 아키텍처 규칙은 조금씩 깨지기 마련입니다. 우아한형제들 파트너셀프서비스팀은 이러한 소모적인 컨벤션 논쟁과 아키텍처 붕괴를 막기 위해 아크유닛(ArchUnit)을 전격 도입했습니다. 기존의 거대한 레거시 부채는 동결하고 신규 위반부터 완벽히 차단하며 점진적으로 코드 품질을 끌어올린 여정을 소개합니다.
규칙을 담은 사내 문서가 레거시화되어 가고 있거나, 코드 리뷰 시간의 절반 이상을 사소한 컨벤션 지적에 낭비하고 있는 다중 모듈 아키텍처 기반의 백엔드 팀에게 적극 권장합니다. 소규모 단일 모듈 프로젝트라면 도입 비용 대비 효용이 적을 수 있으므로 신중히 고려하세요.
기존에는 아키텍처 규칙과 코딩 컨벤션을 사내 위키 등의 문서에만 정의해 두어, 코드 리뷰 과정에서 누락되거나 신규 팀원의 온보딩 시 위반 사항이 누적되는 등의 문제가 있었습니다. 또한, 리뷰어가 동일한 컨벤션 지적을 반복하게 되면서 코드 리뷰의 효율성이 저하되었습니다.
자바 아키텍처 테스트 도구인 아크유닛(ArchUnit)을 별도 모듈로 분리 도입하고, CI 파이프라인과 연동하여 규칙 위반 시 머지가 불가능하도록 강제했습니다. 기존 대규모 레거시 위반 코드는 FreezingArchRule 기능을 통해 동결 예외 처리하여 신규 위반만 차단했으며, 바이트코드 분석이 어려운 Lombok 소스 코드는 자체적인 소스 스캔 방식으로 보완했습니다.
새로운 규칙 위반 건수가 0건으로 유지되기 시작했으며, 동결된 기존 기술 부채 중 @Builder 사용 규칙 위반은 99%(823건에서 10건으로), 웹에서 아웃포트 직접 의존 위반은 14%(4,447건에서 3,813건으로) 감소하는 정량적 개선 성과를 거두었습니다.
Trade-off
Lombok과 같은 소스 레벨 어노테이션(@Retention(SOURCE))은 아크유닛이 분석하는 바이트코드에 남지 않아 별도의 소스 스캔 검사 로직을 추가로 구현해야 했습니다. 또한, FreezingArchRule로 동결한 부채를 실질적으로 해결하기 위한 일정을 병행 관리하지 않으면 단순히 기술 부채를 방치하는 부작용이 생길 수 있으며, 규칙 증가에 따른 테스트 유지보수 비용도 증가합니다.
자바(Java) 코드의 아키텍처와 의존성 방향, 네이밍 컨벤션, 코딩 규칙 등을 유닛 테스트 형태로 검증할 수 있게 돕는 오픈소스 아키텍처 분석 라이브러리입니다. 컴파일된 바이트코드를 분석하여 레이어 간의 접근 권한 제어나 잘못된 의존성 주입 등을 잡아냅니다.
기존 코드베이스에 이미 존재하는 수많은 아키텍처 규칙 위반 사항들을 임시 동결(Freeze) 파일에 기록하여 빌드를 통과시키고, 이후 새롭게 추가되는 신규 위반 사항만 감지하여 차단할 수 있도록 지원하는 기능입니다.
바이트코드(.class) 분석 기반인 ArchUnit이 감지하지 못하는 컴파일 시점 소멸 어노테이션(@Retention(SOURCE))을 탐지하기 위해, 자바 소스 파일 자체를 직접 순회하며 문자열을 파싱하고 예외를 잡아내는 보완적 스캔 기법입니다.




