대규모 Ruby on Rails 프로젝트: 10년간의 경험과 기술적 통찰

Igor Jancev, "Patterns and solutions distilled from 10 years development and maintenance of a ..."

작성자
EuRuKo
발행일
2025년 01월 13일

핵심 요약

  • 1 Igor Yanev는 Technical University of Vienna에서 10년간 대규모 Ruby on Rails 프로젝트를 운영하며 얻은 경험을 공유합니다.
  • 2 배치 작업 처리, API 문서화, 개발자 CLI 도구, 그리고 Rails 버전 마이그레이션 전략 등 실제 적용 사례를 다룹니다.
  • 3 복잡성을 기반 클래스에 숨기고 간결한 인터페이스를 제공하며, Ruby의 내장 기능을 활용하는 개발 철학을 강조합니다.

도입

발표자 Igor Yanev는 Java 개발자로서의 경력을 뒤로하고 Ruby on Rails의 생산성에 매료되어 루비 개발자로 전향하게 된 개인적인 경험을 공유하며 강연을 시작합니다. 그는 현재 Technical University of Vienna에서 10년 이상 근무하며 대규모 Ruby on Rails 기반 캠퍼스 소프트웨어 개발을 담당하고 있습니다. 이 시스템은 하나의 Rails 모놀리스와 네 개의 Java 애플리케이션이 HTTP API를 통해 상호 연동되는 복합적인 구조를 가지고 있으며, SAP, 콜 매니저, 데이터 웨어하우스 등 다양한 외부 시스템과도 데이터를 교환합니다. 2008년 Rails 2.0으로 시작된 이 프로젝트에 2013년에 합류한 그는, 이 강연을 통해 10년간의 운영 경험을 바탕으로 다른 프로젝트에도 유용할 만한 기술적 통찰과 실용적인 해결책들을 소개합니다.

본 강연에서는 대규모 Ruby on Rails 애플리케이션에서 마주하는 실제 문제와 그 해결 방안으로 네 가지 주요 주제를 다룹니다.

첫째, 배치 작업(Batch Jobs) 인프라입니다. 대용량 데이터 처리 및 외부 시스템과의 데이터 교환을 위해 배치 작업이 필수적입니다. 기존 Resque 기반 시스템을 Sidekiq으로 마이그레이션하는 과정에서, 발표자는 한 번에 모든 것을 바꾸려다 실패한 경험을 통해 점진적인 마이그레이션 전략을 채택했다고 설명합니다. 즉, 기존 시스템과 새로운 시스템을 병렬로 운영하며 작업을 하나씩 전환하는 방식입니다. 자체 개발한 배치 작업 UI는 작업의 진행 상황, 성공/실패 여부, 상세 로그 등을 시각적으로 제공합니다. 특히, 수만 건의 항목을 병렬로 처리하기 위한 ‘Parallel Job Processor’와 대용량 파일을 분할 생성 후 병합하는 ‘Parallel File Generator’는 효율적인 데이터 처리를 가능하게 합니다. UI 업데이트에는 Turbo Hotwire를 활용하며, Redis 캐시를 이용해 브로드캐스트 메시지 전송을 초당 한 번으로 제한하는(throttling) 기법을 적용하여 불필요한 네트워크 부하를 줄였습니다. 핵심은 복잡한 로직을 ‘ApplicationJob’과 같은 기반 클래스에 캡슐화하여 실제 배치 작업 코드는 perform 메서드만으로 간결하게 유지하는 것입니다.

둘째, API 문서화 시스템입니다. 200개 이상의 API 메서드를 관리하고 Java 애플리케이션의 API까지 통합 문서화하기 위해 자체 개발한 시스템을 소개합니다. 이 시스템은 Ruby의 inheritedmethod_added 콜백과 클래스 변수를 활용하여 코드 내에서 직접 API 정보(설명, 파라미터, 에러 등)를 정의할 수 있게 합니다. 이를 통해 자동으로 생성되는 문서화 페이지는 API URL 예시, 통계 데이터(마지막 호출 시각, 응답 시간), 그리고 해당 API의 Ruby 컨트롤러 및 메서드 링크까지 제공하여 개발자 편의성을 높였습니다. 외부 젬에 의존하지 않고 직접 구현함으로써, Java 애플리케이션의 WADL 파일을 파싱하여 통합하거나 API 로그를 활용해 자동화된 API 테스트를 구축하는 등 높은 유연성을 확보했습니다.

셋째, 개발자 UI (CLI UI)입니다. 160개가 넘는 Rake 태스크를 관리하고 실행하는 데 발생하는 어려움(태스크 찾기 어려움, 환경 로딩 시간)을 해결하기 위해 Shopify의 CLI UI 젬을 활용한 ‘Atis’라는 자체 CLI 도구를 개발했습니다. 이 도구는 텍스트 포맷팅, 진행률 바, 아이콘 등을 제공하여 개발자에게 더 나은 시각적이고 인터랙티브한 경험을 제공합니다. 또한, 인터랙티브 모드 외에도 스크립트나 CI 환경에서 옵션을 통해 직접 태스크를 실행할 수 있는 기능을 지원합니다. 이 역시 복잡한 CLI 로직을 기반 클래스에 추상화하여 실제 CLI 태스크 코드를 간결하게 유지하는 데 중점을 두었습니다.

넷째, Rails 마이그레이션 전략 (Gemfile Next)입니다. Rails 2에서 3으로의 대규모 버전 업그레이드와 같이 오랜 시간이 걸리는 마이그레이션 시나리오를 위한 독특한 방법을 제시합니다. Gemfile.next와 같은 심볼릭 링크를 생성하고 Gemfileboot.rb에서 이 링크의 존재 여부에 따라 다른 Rails 버전 및 코드를 로드하도록 설정합니다. 이를 통해 동일한 코드 브랜치에서 두 가지 다른 Rails 버전을 동시에 실행하고 테스트할 수 있어, 마이그레이션 브랜치를 길게 유지하지 않고도 점진적인 전환을 용이하게 합니다.

결론

발표자는 10년간의 대규모 Ruby on Rails 프로젝트 경험을 통해 얻은 세 가지 핵심 교훈을 강조하며 강연을 마무리합니다. 첫째, 대규모 마이그레이션은 한 번에 모든 것을 바꾸려 하기보다, 기존 시스템과 새로운 시스템을 병렬로 운영하며 점진적으로 전환하는 것이 스트레스를 줄이고 성공 확률을 높이는 방법입니다. 둘째, GUI, API, CLI 도구 등 어떤 인터페이스를 만들든 항상 최종 사용자의 관점에서 간결하고 직관적인 API를 설계하는 것이 중요합니다. 동시에 복잡한 구현 로직은 기반 클래스 내부에 숨겨야 합니다. 셋째, Ruby on Rails가 제공하는 강력한 내장 기능(예: 콜백)을 최대한 활용하여 불필요한 외부 젬 의존성을 줄이고, 필요한 경우 직접 구현함으로써 코드의 유연성과 유지보수성을 높일 수 있습니다. 이러한 실용적인 접근 방식과 개발 철학이 대규모 시스템을 안정적으로 운영하고 지속적으로 발전시키는 데 핵심적인 역할을 했음을 보여줍니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!