pile·
백엔드·flexflex·

[의존성의 방향을 따라 2/5] 의존 그래프를 읽는 Planner

50개 레포 Spring Boot 버전업을 안전하게 자동화하는 시스템에서, Planner가 Nexus 아티팩트 의존성 선언을 파싱해 레포 간 DAG를 구축하고 변경 유형에 따라 전파 방향을 결정하는 방법을 설명하는 시리즈 2편. 같은 의존 그래프 위에서도 Spring Boot는 upstream-first, Kotlin은 downstream-first로 전파 방향이 정반대로 뒤집힌다.

핵심 포인트
  • Planner의 역할: Nexus 아티팩트 선언 파싱 → 레포 간 의존 그래프(DAG) 구축 → 변경 성격 판별 → Kahn's algorithm 위상 정렬로 Wave 실행 계획 생성
  • Spring Boot vs Kotlin 전파 방향 정반대: Spring Boot = upstream-first (API/BOM 의존 방향), Kotlin = downstream-first (바이트코드 메타데이터 하위 호환)
  • Wave 기반 병렬 처리: 50개 레포를 일렬로 세우면 50번 대기 → 의존 구조를 읽으면 Wave 3개로 압축, Wave 2의 40개 이상 서비스 레포는 병렬 처리
  • DAG 필수 이유: 순환 의존이 하나라도 있으면 "무엇부터 올려야 하는가"에 교착 상태 발생 → 위상 정렬(topological sort) 자체가 불가능
  • 버전 관리 플러그인이 전제 조건: 모든 레포에 동일한 의존성 선언 방식 강제 → 파싱 로직 하나로 전체 그래프 구축 가능
  • Blast radius 정량화: gradle-plugins 변경 = 50개 이상 레포에 영향, 리프 노드 = 해당 레포만 영향 → 리뷰 정책과 PR 생성에 직접 활용
상세 정리
  • 레포 간 의존성은 기존에 비가시적: 각 레포 build.gradle.kts에 분산된 버전 선언을 파싱해야 전체 지형도 복원 가능
  • 핵심 4단계 의존 체인: gradle-plugins → commons-core(40+ 레포 의존) → backend-commons(40+ 레포 의존) → 서비스 레포들(리프 노드)
  • Kotlin downstream-first 이유: 상위 Kotlin으로 컴파일된 라이브러리를 하위 Kotlin 클라이언트가 읽으면 메타데이터 호환성 문제 발생 가능 — 서비스 레포가 먼저 올려야 안전
  • 알고리즘 핵심 아이디어: 그래프 구조는 그대로 두고, downstream-first일 때만 간선을 뒤집은 뒤 동일한 Kahn's algorithm 적용 → 정렬 로직 한 벌로 두 방향 처리
  • PropagationDirection 3종: UPSTREAM_FIRST(Spring, 라이브러리 API), DOWNSTREAM_FIRST(Kotlin, JVM), PARALLEL(보안 패치 긴급 모드)
  • Wave 구조 예시(Spring Boot): Wave 0 = commons-core / Wave 1 = backend-commons / Wave 2 = 40+ 서비스 레포(병렬)
  • "꼭 기다려야 하는 순간"만 골라냄: 4단계 깊이의 그래프라도 Wave 3개로 압축, 최대 병렬화 달성
  • 일관된 DSL의 중요성: 레포마다 버전 선언 방식이 달랐다면(version catalog/직접선언/변수/BOM) 파서 유지보수 비용이 레포 수에 비례해 증가
  • 같은 한 줄 변경도 gradle-plugins vs 리프 노드는 위험 무게가 전혀 다름 → 그래프가 그 차이를 정량적으로 제공하는 유일한 근거
왜 읽나다중 레포 환경에서 변경 유형별로 전파 방향이 달라지는 이유를 이해하고, 의존 그래프 + 위상 정렬 + Wave 병렬 처리로 안전한 자동 마이그레이션 계획을 수립하는 아이디어를 배울 수 있다.
flex
flex 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·twilio-engTwilio Engineering·

    Programmable Messaging에서 Verify API로 마이그레이션하기

    Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

    요약 이어보기
    #authentication#twilio#sms+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 2부

    포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  3. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2