이러한 모듈화의 목표를 이해하기 위해 먼저 ‘애플리케이션’과 ‘라이브러리’의 개념을 정의합니다. 애플리케이션은 독립적으로 실행되어 특정 기능을 수행하는 소프트웨어(예: 웹 서버, 람다 함수)를 의미하며, 라이브러리는 애플리케이션에 포함되어 기능을 확장하는 소프트웨어(예: Ruby의 Gem)를 지칭합니다. 모든 소프트웨어는 본질적으로 이 두 가지 범주 중 하나에 속합니다. 모놀리식 시스템 내에서 각 패키지가 애플리케이션 또는 라이브러리 중 어떤 역할을 할 것인지 결정하는 것이 중요하며, 이를 통해 ‘추출 가능성(Extractability)’을 논의할 수 있습니다. 추출 가능성이란 특정 패키지가 모놀리스에서 분리되었을 때 독립적으로 작동할 수 있는 상태를 의미합니다. 라이브러리의 경우, 다른 패키지에 대한 의존성이 없는 상태에서 코드를 새 저장소로 옮겨 테스트를 통과시키는 것이 추출 가능성의 핵심입니다. 이 과정에서 공유된 테스트 설정, 헬퍼, 애플리케이션 설정, 그리고 Packwerk가 감지하지 못하는 메타 프로그래밍 등으로 인해 오류가 발생할 수 있습니다. 애플리케이션의 추출 가능성은 훨씬 더 복잡합니다. 공개 API가 원시 타입만 사용하고, 개인 정보 침해가 없으며, 데이터베이스가 분리되어야 하는 등 여러 전제 조건이 충족되어야 합니다. 또한, 내부 API를 외부에서 사용 가능한 형태로 전환하는 과정이 필수적입니다. 추출 테스트는 라이브러리와 유사하게 코드를 새 저장소로 옮겨 테스트를 실행하고 오류를 수정하는 방식으로 진행됩니다. 이 과정에서는 기존 애플리케이션의 상수 호출을 공개 API로 대체하고, 추출된 애플리케이션의 데이터를 올바른 상태로 가져오는 작업이 추가로 필요합니다. 실제 추출 과정은 새 저장소를 생성하고, 이를 Gem 또는 독립 애플리케이션으로 만든 다음, 조직 내에 공유하고, 원래 호스트 애플리케이션에 의존성을 추가하며, 최종적으로 원본 애플리케이션에서 해당 패키지의 코드를 제거하는 단계로 이루어집니다. 이러한 추출은 완전한 분리라는 가치를 제공하지만, 분리된 아티팩트를 유지 관리하는 비용이 발생합니다.
Gusto의 점진적 모듈화 목표: 추출 가능한 애플리케이션 및 라이브러리
작성자
Ruby on Rails 소식지
발행일
2025년 07월 23일
핵심 요약
- 1 Gusto는 대규모 Ruby on Rails 모놀리식 코드베이스를 '추출 가능한 애플리케이션 및 라이브러리'로 점진적 모듈화하는 목표를 제시합니다.
- 2 이는 각 패키지를 독립적으로 작동하도록 분리하는 것을 의미하며, 애플리케이션과 라이브러리의 추출 가능성 기준과 그 과정을 상세히 설명합니다.
- 3 모듈화는 코드베이스의 안정성과 유지보수성을 향상시키며, 각 패키지의 특성에 맞춰 전략적으로 접근해야 하는 중요한 아키텍처 결정입니다.
도입
Gusto는 방대한 Ruby on Rails 기반 모놀리식 코드베이스를 운영하는 과정에서 발생하는 복잡성을 해결하기 위해 '점진적 모듈화' 전략을 채택했습니다. 이 글은 모듈화 여정의 최종 목표를 '추출 가능한 애플리케이션과 라이브러리'로 명확히 제시하며, 이는 유사한 상황에 처한 다른 기업들에게도 유의미한 방향성을 제공합니다. 대규모 단일 시스템을 효율적으로 관리하고 발전시키기 위한 핵심적인 접근 방식과 그 배경을 설명합니다.
결론
결론적으로, 점진적 모듈화는 코드베이스의 추출 가능한 부분이 부족하다는 문제에서 시작됩니다. 모듈화를 어디까지 진행할지는 영향력과 작업량 사이의 균형을 고려한 전략적 결정입니다. 각 패키지에 대해 추출 가능성 연속체에서 어디까지 나아갈지 결정함으로써, 학습 목적의 작은 패키지, 안정성이 부족한 핵심 비즈니스 패키지, 또는 핵심 기능의 비대화를 막기 위한 보조 패키지 등 다양한 최적화 옵션을 선택할 수 있습니다. 궁극적으로 이 여정은 대규모 Ruby on Rails 애플리케이션의 유지보수성과 확장성을 크게 향상시키는 데 기여합니다.