본 강연에서는 대규모 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의 inherited
및 method_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
와 같은 심볼릭 링크를 생성하고 Gemfile
및 boot.rb
에서 이 링크의 존재 여부에 따라 다른 Rails 버전 및 코드를 로드하도록 설정합니다. 이를 통해 동일한 코드 브랜치에서 두 가지 다른 Rails 버전을 동시에 실행하고 테스트할 수 있어, 마이그레이션 브랜치를 길게 유지하지 않고도 점진적인 전환을 용이하게 합니다.