#DevOps

되도록 최신 버전을 사용하는게 왜 이렇게 어려울까?

되도록 최신 버전을 사용하는게  왜 이렇게 어려울까?
01

Summary

“어느 버전 쓰나요?” 질문을 완전히 지워버린 flex의 빌드 플랫폼 엔지니어링

단순해 보이는 규칙 아래 감춰진 빌드 시스템 동형성과 의존성 단방향화의 기술적 비밀

본 아티클은 라이브러리를 언제나 최신 상태로 유지하기 위해 flex가 개발한 'version family plugin'과 그 기반 인프라를 소개합니다. 기술 통일을 뜻하는 '동형성'의 중요성, 순환 없는 단방향 의존성 아키텍처의 설계, 그리고 전사 레포지토리에 버전을 안전하게 전파하는 Evergreen 파이프라인의 실체를 심도 있게 보여줍니다. 단순한 툴 개발을 넘어 동료 엔지니어들이 가볍고 빠르게 일할 수 있는 평평한 기반을 닦는 플랫폼 조직의 본질적 가치를 전달합니다.

  • 01그룹 이름(group name)을 기반으로 여러 아티팩트의 버전을 단일 패밀리로 동기화하여 버전 불일치 원천 차단
  • 02의존 구조를 단방향 순환이 없는 구조(DAG)로 강제해 자동화 도구가 배포 순서를 안정적으로 계산하도록 설계
  • 03레포 : 도메인 : 모듈 구조를 1 : N : M 물리적 모듈로 쪼개어 헥사고날 아키텍처 의존 방향 제어
  • 04버전 정책을 레포 외부로 분리해 문서나 예외 규율 대신 구조적 장치로 전사 통일성 강제
  • 05공통 라이브러리 수정 사항을 제품 레포지토리로 안전하게 흘려보내는 Evergreen 자동화 파이프라인 적용

RECOMMENDATION

마이크로서비스나 폴리레포 아키텍처 환경에서 공통 모듈 버전 불일치로 마찰을 겪고 있거나, 효율적인 플랫폼 인프라 및 자동화 파이프라인을 구축하려는 데브옵스 및 시니어 백엔드 엔지니어에게 적극 권장합니다.

The Problem

폴리레포 환경에서 각 프로젝트가 개별적으로 라이브러리 버전을 고정하여 사용함에 따라, 어떤 버전이 안전하게 검증된 버전인지 공유되는 단일 출처가 없어 버전 불일치로 인한 슬랙 소통 및 디버깅 비용이 반복적으로 누적되는 문제가 있었습니다.

The Solution

사내 Gradle 플러그인(version family plugin)을 개발하여 그룹명 기준으로 버전을 묶어 관리하고, 의존 관계를 순환이 없는 단방향 그래프(DAG) 구조로 정렬한 뒤 버전 전파 자동화 파이프라인(Evergreen)을 구축했습니다.

The Result

어떤 라이브러리 버전을 써야 하는지에 대한 개발자들의 고민과 슬랙 소통 비용이 완전히 제거되었으며, 버전 비호환으로 밤새 디버깅하던 마찰을 구조적으로 없애 개발 편의성을 대폭 향상했습니다.

Trade-off

강력한 버전 및 의존성 응집의 대가로 시스템의 비가역성이 증가하여, 공통 빌드 정책에 오류가 생길 경우 전사 레포지토리가 동시에 장애 영향을 받을 수 있는 잠재적 리스크가 존재하며 모든 레포지토리가 Gradle 빌드 시스템을 공유해야만 작동한다는 전제 조건이 따릅니다.

03

Key Concepts

Concept · 01

버전 패밀리 플러그인 (Version Family Plugin)

개별 라이브러리의 버전을 명시하는 대신 특정 그룹으로 묶어 검증된 동일한 버전 세트를 공유하게 만드는 빌드 도구입니다. 레포지토리 외부에서 일관된 버전 규칙을 일괄 부여할 수 있는 메커니즘을 제공합니다.

  • 레포지토리 경계에 얽매이지 않고 group name을 기준으로 버전을 강제하여 호환성을 보장했습니다.
  • 레포와 도메인, 모듈의 다대다 복잡도를 단일 버전 규칙으로 수렴시켰습니다.
Concept · 02

동형성 (Homogeneity)

조직 내 모든 소프트웨어 프로젝트가 동일한 빌드 언어, 도구 체계, 그리고 릴리스 정책을 완전하게 공유하는 일관성 있는 상태를 의미합니다. 이는 강력한 글로벌 규칙을 전사 프로젝트에 일괄적으로 강제하고 감시하기 위한 필수적인 바탕이 됩니다.

  • 사내 버전 규율을 강력하게 적용하고 강제할 수 있는 유일한 단일 빌드 제어 지점을 제공했습니다.
  • 자율성 보장 과정에서 생긴 각 팀의 상이한 빌드 설정을 하나의 표준 Gradle 빌드 환경으로 완전히 극복해냈습니다.
Concept · 03

단방향 의존성 (DAG)

서비스 및 모듈 간의 의존성이 어떠한 순환 경로도 형성하지 않고 한 방향으로만 흐르는 구조적 정렬을 말합니다. 순환 참조로 인한 복잡성을 배제하고 변경의 인과 관계를 예측 가능하게 만들어 줍니다.

  • 배포 파이프라인 상에서 다음 빌드 대상과 배포 순서를 기계적으로 예측 및 자동 계산하는 것을 가능하게 만들었습니다.
  • 교착 상태 없이 하위 서비스들로 최신 빌드 변경 사항을 연속적이고 안전하게 전파할 수 있는 환경을 선사했습니다.