JuggleBee의 위대한 도약 — Rails 4 앱을 Rails 8로 재구축하기 (1부)

JuggleBee’s Great Leap — Rebuilding a Rails 4 App in Rails 8 (Part 1) | by Braden King | Jul, 2025 | Medium

작성자
jeff
발행일
2025년 07월 30일

핵심 요약

  • 1 이 글은 2015년에 개발된 Ruby on Rails 4.2 기반의 JuggleBee 온라인 경매 플랫폼을 최신 Rails 8로 대규모 업그레이드한 과정을 상세히 설명합니다.
  • 2 작성자는 점진적 업그레이드 대신 Rails 4.2에서 Rails 8로, Ruby 2.2에서 3.4.3으로 직접적인 전환을 선택했으며, 모델, 컨트롤러, JavaScript, 백그라운드 작업 등 핵심 요소를 현대화했습니다.
  • 3 특히, 기존 Sidekiq/Redis 대신 SolidQueue를, 그리고 자체 배포 스크립트 대신 Kamal을 도입하여 인프라를 대폭 간소화하고 효율성을 극대화한 것이 주요 성과입니다.

도입

JuggleBee는 2015년에 Ruby on Rails 4.2와 Ruby 2.2를 기반으로 구축된 나미비아 최초의 온라인 경매 플랫폼으로, 수년간 안정적으로 운영되어 왔습니다. 작성자는 여러 차례 버전 업그레이드를 고려했지만, Ruby와 Rails 간의 상호 의존성 문제로 인해 어려움을 겪었습니다. 결국, 점진적인 업그레이드가 가져올 복잡성과 시간을 고려하여 Rails 4.2에서 Rails 8로, 그리고 Ruby 2.2에서 3.4.3으로의 대규모 직접 업그레이드를 단행하기로 결정했습니다. 이 글은 이러한 '위대한 도약' 과정에서 직면했던 도전 과제와 그를 통해 얻은 교훈을 상세히 다룹니다.

마이그레이션은 새로운 Rails 8 프로젝트를 생성하고 기존 Gemfile을 최신 호환 버전으로 업데이트하는 것부터 시작되었습니다. JuggleBee의 코드베이스가 잘 분리된 비즈니스 로직 컴포넌트로 구성되어 있어 마이그레이션이 비교적 원활했습니다. 특히, 모델과 컨트롤러는 과도하게 비대해지지 않았으며, ‘서비스 객체’와 ‘뷰 데코레이터’ 패턴을 활용하여 로직이 명확하게 분리되어 있었습니다.

모델, 컨트롤러, 서비스 및 뷰 마이그레이션: - 모델: Ruby 2.2에서 3.4.3으로의 핵심 언어 변경은 미미했지만, Rails 아키텍처의 변화(예: ApplicationRecord 도입)에 대한 대응이 필요했습니다. 데이터베이스는 PostgreSQL 9.6에서 17.5로 업그레이드되었으며, 기존 마이그레이션 파일 대신 pg_dump를 통해 schema.rb를 생성하는 방식을 채택했습니다. belongs_tooptional: true를 추가하고, update_attributesupdate로, 구식 유효성 검사 메서드를 최신 문법으로 변경하는 등의 작업이 이루어졌습니다. 뷰는 사용된 Haml, Redcarpet, Simple Form, Cocoon 등의 Gem이 활발히 유지보수되어 변경이 거의 필요 없었습니다. - 컨트롤러: 서비스 객체를 활용한 복잡한 로직 분리 덕분에 마이그레이션은 대부분 순조로웠습니다. Rails 8의 강화된 규칙에 따라 파라미터는 JSON으로 유효해야 했고, before_filterbefore_action으로, redirect_to :backredirect_back fallback_location: root_path로 대체되었습니다. responders Gem이 더 이상 포함되지 않아 respond_with 호출은 respond_to 블록으로 재작성되었습니다.

JavaScript 현대화: 프론트엔드 자산 관리 방식에 큰 변화가 있었습니다. Sprockets 대신 importmaps를 기본 자산 관리자로 채택하여 Chartkick, Masonry, Bootstrap 등 여러 프론트엔드 기능을 제공하던 Gem들을 importmaps pin 방식으로 대체했습니다. JavaScript 클래스들은 ES 모듈로 로드될 수 있도록 importexport 문을 사용하도록 변경되었으며, 파일 위치도 app/assets/javascripts/에서 app/javascript/로 이동했습니다. jQuery는 여전히 유지하기로 결정했습니다.

백그라운드 작업 및 스케줄링: 이 영역은 이번 마이그레이션의 가장 큰 성과 중 하나였습니다. 기존의 Sidekiq + Redis + Whenever(cron) 조합은 Rails 8에 내장된 SolidQueue로 대체되었습니다. SolidQueue는 Redis 없이 기존 데이터베이스(PostgreSQL)를 사용하여 작업 큐를 관리함으로써, 별도의 Redis 서비스와 컨테이너를 제거하고 서버 메모리를 확보할 수 있었습니다. whenever Gem 역시 SolidQueue의 내장 recurring.yml 기능으로 대체되어 백그라운드 작업 관리가 훨씬 간소화되었습니다. 작업 인수는 JSON 직렬화 가능해야 한다는 점이 주요 변경 사항이었습니다.

인프라 및 배포: 오랫동안 작성자가 직접 작성한 쉘 스크립트를 사용하여 배포를 관리해왔습니다. 이 스크립트는 Docker 이미지 빌드, 컨테이너 재시작, 원자적 릴리스, 이전 배포 정리 등을 효율적으로 처리했습니다. 그러나 Rails 앱에 특화된 서버 프로비저닝 및 배포 도구인 Kamal 2의 도입으로 배포 프로세스가 혁신적으로 간소화되었습니다. Kamal은 Docker, Git 설치, Traefik(내장된 프록시 및 SSL 처리), 액세서리 관리(Postgres, Redis), 스케일링 등을 자동화하여 Nginx와 같은 추가적인 의존성을 제거했습니다. 이는 배포를 훨씬 빠르고 효율적으로 만들었으며, 인프라를 더욱 가볍고 유지보수하기 쉽게 만들었습니다.

결론

Rails 8 기반의 JuggleBee 앱을 성공적으로 실행하고 배포 가능하게 만든 것은 마이그레이션의 절반을 의미합니다. 이 과정을 통해 모델과 컨트롤러가 현대화되었고, Sprockets 대신 importmaps가 도입되었으며, Sidekiq/Redis/cron은 SolidQueue로, 그리고 자체 배포 스크립트는 Kamal 2로 대체되면서 앱은 더욱 가볍고, 배포가 빠르며, 유지보수가 용이해졌습니다. 하지만 아직 완료되지 않은 과제들이 남아있습니다. 레거시 PostgreSQL 9.6 데이터베이스를 PostgreSQL 17.5로 마이그레이션하고, CarrierWave를 ActiveStorage로 교체하여 사용자 업로드 파일을 S3로 마이그레이션하는 작업이 필요합니다. 또한, Rails 암호화된 비밀과 Bitwarden CLI를 통한 자격 증명 보안 강화, 코드 정리, 테스트 커버리지 완성 및 새로운 스택의 전반적인 성능 개선이 후속 과제로 남아있습니다. 이 글의 2부에서는 이러한 마무리 작업과 예상치 못한 난관, 그리고 JuggleBee를 Rails 4의 유물에서 현대적이고 프로덕션 준비가 완료된 Rails 8 앱으로 변모시키는 최종 단계에 대해 다룰 예정입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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