![[의존성의 방향을 따라 2/5] 의존 그래프를 읽는 Planner](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Fv31psllp%2Fproduction%2Fcfc2fee7bc9a333e841c5c5cf5cc07721137979c-1684x1030.png%3Fauto%3Dformat%26fit%3Dmax%26w%3D1200&w=3840&q=75)
의존성 그래프와 위상 정렬로 풀어낸 복잡한 마이크로서비스 자동 업데이트 전략
수많은 레포지토리가 얽힌 환경에서 공통 라이브러리를 업그레이드하는 것은 단순한 작업이 아닙니다. 본 아티클은 보이지 않는 레포 간 연결 고리를 DAG로 시각화하고, 기술적 맥락에 따라 업데이트 방향을 지능적으로 뒤집는 'Planner'의 메커니즘을 소개합니다. 단순 반복 작업을 넘어 구조적 일관성을 통해 엔지니어링 효율을 극대화하는 플랫폼 개발의 정수를 보여줍니다.
마이크로서비스 아키텍처에서 공통 라이브러리 전파 및 버전 관리에 병목을 겪고 있는 플랫폼 엔지니어나 DevOps 팀에게 이 아키텍처 설계를 적극 추천합니다.
멀티 레포지토리 환경에서 레포 간 의존 관계가 가시화되지 않아 버전 업데이트 시 안전한 작업 순서를 판단하기 어렵고, Kotlin이나 Spring Boot처럼 기술 특성에 따라 요구되는 전파 방향이 달라지는 복잡성이 존재합니다. 일관되지 않은 의존성 선언 방식은 자동화된 그래프 구축을 방해하며 순환 의존성 발생 시 교착 상태에 빠질 위험이 있습니다.
모든 레포지토리에 통일된 Gradle DSL 선언을 강제하여 파싱 가능한 환경을 조성하고, 이를 기반으로 레포 간 의존성을 DAG(유향 비순환 그래프)로 구축하는 'Planner'를 도입했습니다. 변경 대상의 특성에 따라 전파 방향(Upstream/Downstream)을 판별한 뒤 간선을 조정하고, 위상 정렬(Topological Sort)을 수행하여 병렬 실행이 가능한 'Wave' 단위의 업데이트 계획을 생성합니다.
50개 이상의 레포지토리를 일일이 순차적으로 업데이트하던 비효율을 개선하여 최적의 병렬 처리 경로를 확보했으며, 변경 사항의 '폭발 반경(Blast Radius)'을 정량화하여 위험도에 따른 차등화된 리뷰 정책을 적용할 수 있게 되었습니다. 직렬 대기 횟수를 그래프 깊이 수준인 3~4단계로 압축하여 전체 배포 속도를 높였습니다.
Trade-off
시스템의 안정적인 작동을 위해 모든 레포지토리가 버전 관리 플러그인의 특정 DSL 규격을 엄격히 준수해야 하므로 개발 자유도가 일부 제한될 수 있습니다. 표준을 따르지 않는 예외적인 레포지토리는 자동화 대상에서 제외되거나 수동 관리가 필요하다는 한계가 존재합니다.
방향성은 존재하지만 순환하는 경로가 없는 그래프 구조로, 작업 간의 선후 관계를 정의하는 데 적합합니다.
유향 그래프의 꼭짓점들을 변의 방향을 거스르지 않도록 나열하는 알고리즘입니다.
특정 컴포넌트의 변경이 시스템 전체에 미칠 수 있는 영향력의 범위를 의미합니다.




