DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 우아한형제들
  • Related reads#ArchUnit
#Backend

문서로만 지키던 아키텍처 규칙, 테스트 코드로 강제하기

문서로만 지키던 아키텍처 규칙, 테스트 코드로 강제하기
01

Summary

“그거 컨벤션 위반인데요?” 잔소리 대신 ‘테스트 코드’로 아키텍처 강제하기

말뿐인 아키텍처 문서는 가라! ArchUnit과 CI로 신규 위반 0건을 달성한 우아한형제들의 실전 전환기

아무리 꼼꼼히 문서를 작성하고 코드 리뷰를 해도 아키텍처 규칙은 조금씩 깨지기 마련입니다. 우아한형제들 파트너셀프서비스팀은 이러한 소모적인 컨벤션 논쟁과 아키텍처 붕괴를 막기 위해 아크유닛(ArchUnit)을 전격 도입했습니다. 기존의 거대한 레거시 부채는 동결하고 신규 위반부터 완벽히 차단하며 점진적으로 코드 품질을 끌어올린 여정을 소개합니다.

  • 01코드 리뷰의 한계를 극복하고 아키텍처 규칙을 빌드 단계에서 자동으로 강제하는 자동화 체계 구축
  • 02수천 건의 기존 규칙 위반을 감당할 수 있게 해준 아크유닛의 FreezingArchRule 실전 활용법
  • 03Lombok 등 바이트코드에 남지 않는 소스 레벨 어노테이션을 탐지하기 위한 커스텀 소스 스캐닝 구현
  • 04AI 에이전트(Claude)를 활용한 대규모 반복 규칙 이관 및 테스트 생성 공수 획기적 단축
  • 05실제 적용 후 @Builder 오용 등 기존 기술 부채를 최대 99%까지 청소해낸 놀라운 정량적 결과

+RECOMMENDATION

규칙을 담은 사내 문서가 레거시화되어 가고 있거나, 코드 리뷰 시간의 절반 이상을 사소한 컨벤션 지적에 낭비하고 있는 다중 모듈 아키텍처 기반의 백엔드 팀에게 적극 권장합니다. 소규모 단일 모듈 프로젝트라면 도입 비용 대비 효용이 적을 수 있으므로 신중히 고려하세요.

The Problem

기존에는 아키텍처 규칙과 코딩 컨벤션을 사내 위키 등의 문서에만 정의해 두어, 코드 리뷰 과정에서 누락되거나 신규 팀원의 온보딩 시 위반 사항이 누적되는 등의 문제가 있었습니다. 또한, 리뷰어가 동일한 컨벤션 지적을 반복하게 되면서 코드 리뷰의 효율성이 저하되었습니다.

The Solution

자바 아키텍처 테스트 도구인 아크유닛(ArchUnit)을 별도 모듈로 분리 도입하고, CI 파이프라인과 연동하여 규칙 위반 시 머지가 불가능하도록 강제했습니다. 기존 대규모 레거시 위반 코드는 FreezingArchRule 기능을 통해 동결 예외 처리하여 신규 위반만 차단했으며, 바이트코드 분석이 어려운 Lombok 소스 코드는 자체적인 소스 스캔 방식으로 보완했습니다.

The Result

새로운 규칙 위반 건수가 0건으로 유지되기 시작했으며, 동결된 기존 기술 부채 중 @Builder 사용 규칙 위반은 99%(823건에서 10건으로), 웹에서 아웃포트 직접 의존 위반은 14%(4,447건에서 3,813건으로) 감소하는 정량적 개선 성과를 거두었습니다.

Trade-off

Lombok과 같은 소스 레벨 어노테이션(@Retention(SOURCE))은 아크유닛이 분석하는 바이트코드에 남지 않아 별도의 소스 스캔 검사 로직을 추가로 구현해야 했습니다. 또한, FreezingArchRule로 동결한 부채를 실질적으로 해결하기 위한 일정을 병행 관리하지 않으면 단순히 기술 부채를 방치하는 부작용이 생길 수 있으며, 규칙 증가에 따른 테스트 유지보수 비용도 증가합니다.

03

Key Concepts

Concept · 01

아크유닛 (ArchUnit)

자바(Java) 코드의 아키텍처와 의존성 방향, 네이밍 컨벤션, 코딩 규칙 등을 유닛 테스트 형태로 검증할 수 있게 돕는 오픈소스 아키텍처 분석 라이브러리입니다. 컴파일된 바이트코드를 분석하여 레이어 간의 접근 권한 제어나 잘못된 의존성 주입 등을 잡아냅니다.

  • 헥사고날 아키텍처 레이어 간의 올바른 의존 흐름(예: 도메인 계층이 외부 인프라 계층을 직접 바라보지 않음)을 검증하기 위해 도입되었습니다.
  • 시스템 출력(System.out) 금지, @Autowired 필드 주입 금지 등의 정적 코딩 스타일을 검증하는 데 활용되었습니다.
Concept · 02

프리징 아크 룰 (FreezingArchRule)

기존 코드베이스에 이미 존재하는 수많은 아키텍처 규칙 위반 사항들을 임시 동결(Freeze) 파일에 기록하여 빌드를 통과시키고, 이후 새롭게 추가되는 신규 위반 사항만 감지하여 차단할 수 있도록 지원하는 기능입니다.

  • 기존 코드베이스에 누적되어 있던 웹 계층에서 아웃포트 직접 의존 등 수천 건의 규칙 위반을 동결 처리하여 즉각적인 도입 장벽을 낮추었습니다.
  • 동결된 목록은 Git으로 관리하여 의도치 않은 우회를 방지하고, 리팩터링을 통해 위반 사항이 해결되면 자동으로 목록에서 지워지도록 구축했습니다.
Concept · 03

소스 레벨 어노테이션 스캐닝 (Source-Level Annotation Scanning)

바이트코드(.class) 분석 기반인 ArchUnit이 감지하지 못하는 컴파일 시점 소멸 어노테이션(@Retention(SOURCE))을 탐지하기 위해, 자바 소스 파일 자체를 직접 순회하며 문자열을 파싱하고 예외를 잡아내는 보완적 스캔 기법입니다.

  • Lombok의 @Builder, @AllArgsConstructor 사용 제한 규칙이 컴파일 이후 바이트코드 수준에서 추적되지 않는 한계를 해결하는 데 사용되었습니다.
  • src/main/java 하위 파일을 직접 탐색하며 금지된 어노테이션 패턴을 찾아 기존 동결 구조와 결합한 하이브리드 검사 체계를 구축했습니다.
Continue reading · same source

우아한형제들More from 우아한형제들

View all posts from 우아한형제들
  • 한꺼번에 짊어지던 배치를 내려놓고, 하나씩 흘려보내는 워크플로로

    Kotlin CoroutineTemporalMongoDB
    21시간 전
  • AI에게 만드는 법 대신 실패하는 법을 묻다: 포토그래퍼의 수천 명 동시 접속 게임 만들기

    Server-Sent EventsRedis PubSubKubernetes
    1주 전
  • 옆 팀은 AI를 어떻게 쓸까? 첫 사내 기술 콘퍼런스 우아한테크데이

    Developer RelationsKnowledge SharingAI Transformation
    2주 전
  • 기술블로그 세 번째 책 《요즘 우아한 백엔드 개발》 출간

    KotlinApache KafkaElasticsearch
    1개월 전
  • 배포 없이 앱과 로컬 웹을 잇다

    ProxyTunnelingWebSocket
    1개월 전

Related reads#ArchUnit

Explore #ArchUnit
Netflix

Nebula ArchRules를 활용한 ArchUnit 확장: 넷플릭스의 대규모 아키텍처 거버넌스

#ArchUnit4개월 전

Source

우아한형제들
우아한형제들
Engineering Blog

Published · September 7, 2026

Topics

ArchUnitHexagonal ArchitectureCI/CDStatic AnalysisJava