JuggleBee의 대규모 도약: 데이터 마이그레이션, ActiveStorage, 그리고 프로덕션 준비 (2부)

JuggleBee’s Great Leap — Data Migration, ActiveStorage, and Production Readiness (Part 2) | by Braden King | Aug, 2025 | Medium

작성자
jeff
발행일
2025년 08월 05일

핵심 요약

  • 1 오래된 Rails 애플리케이션인 JuggleBee를 최신 Ruby 3.4.3, Rails 8, PostgreSQL 17.5 환경으로 성공적으로 마이그레이션했습니다.
  • 2 PostgreSQL 데이터베이스, 5만 개 이상의 이미지(CarrierWave에서 ActiveStorage로), 그리고 보안 자격 증명 시스템을 현대화하는 과정이 상세히 설명됩니다.
  • 3 스크립트 기반의 반복 가능한 작업, 철저한 스테이징 테스트, 기술 부채 해소, 그리고 Kamal과 같은 최신 배포 도구 활용이 성공적인 마이그레이션의 핵심 요소였습니다.

도입

JuggleBee 애플리케이션은 오랜 기간 사용된 Rails 4.2 기반의 레거시 시스템을 최신 Rails 8, Ruby 3.4.3, PostgreSQL 17.5 환경으로 전면 개편하는 대규모 마이그레이션 프로젝트를 수행했습니다. 이 프로젝트는 단순한 버전 업그레이드를 넘어, 데이터베이스, 이미지 스토리지, 보안 자격 증명 관리 등 핵심 인프라를 현대화하여 애플리케이션의 성능과 유지보수성을 극대화하는 데 중점을 두었습니다. 특히 프로덕션 데이터 손실 없이 안전하게 전환하는 것이 중요한 과제였습니다.

이번 마이그레이션은 크게 세 가지 핵심 영역에서 진행되었습니다.

1. 데이터베이스 마이그레이션

  • 과제: 기존 PostgreSQL 9.6은 공식 지원이 종료되어 최신 버전인 17.5로의 업그레이드가 필수적이었습니다. 버전 간의 큰 차이로 인해 데이터 손상 위험이 존재했습니다.
  • 해결: pg_dumpall 대신 단일 데이터베이스를 대상으로 하는 pg_dump를 사용하여 버전 불일치 문제를 피했습니다. 이 과정에서 docker exec 명령과 환경 변수를 활용하여 안전하게 데이터를 백업하고 새로운 PostgreSQL 17.5 인스턴스로 가져왔습니다.
  • 이점: 네이티브 JSON 필드 지원, 증분 백업, 향상된 메모리 관리 및 인덱싱을 통한 성능 향상 등 최신 PostgreSQL의 이점을 활용할 수 있게 되었습니다.

2. 이미지 마이그레이션 (CarrierWave에서 ActiveStorage로)

  • 과제: 약 5만 개에 달하는 기존 리스팅 이미지는 CarrierWave와 고정된 S3 경로를 사용하고 있어 유지보수가 어렵고 미래 확장에 적합하지 않았습니다.
  • 해결: Rails 8 업그레이드와 함께 ActiveStorage로 전환했습니다. 기존 이미지를 레거시 S3 버킷에서 다운로드한 후 ActiveStorage를 통해 재업로드하는 Ruby 스크립트를 작성하여 처리했습니다. 이 스크립트는 AWS 속도 제한을 피하기 위해 동기적으로 실행되었으며, 약 4시간이 소요되었습니다.
  • 이점: ActiveStorage 도입으로 업로더 및 하드코딩된 S3 경로가 사라지고, 이미지가 자동으로 관리되며, 필요에 따라 썸네일이 생성되어 시스템이 더욱 간결하고 유지보수하기 쉬워졌습니다.

3. 보안 자격 증명 관리 현대화

  • 과제: 기존 Rails 4.2 환경에서는 secrets.yml에 평문으로 비밀 정보가 저장되어 Git에 커밋되는 보안 취약점이 있었습니다.
  • 해결: Rails 5.2에서 도입된 암호화된 자격 증명(encrypted credentials)을 사용하고, 배포 도구 Kamal이 Bitwarden과 같은 비밀번호 관리자로부터 직접 비밀 정보를 가져오도록 설정했습니다.
  • 이점: Rails 마스터 키, 데이터베이스 자격 증명 등 모든 환경 변수가 안전하게 관리되며, 수동 복사나 저장소에 평문 비밀 정보가 노출될 위험이 사라졌습니다.

4. 마이그레이션을 통해 얻은 교훈

  • 스크립트의 중요성: 반복 가능하고 신뢰할 수 있는 스크립트는 복잡한 마이그레이션 과정에서 정신적 부담을 줄이고 효율성을 높입니다.
  • 스테이징 환경에서의 철저한 테스트: 프로덕션 배포 전 스테이징 환경에서 전체 마이그레이션 과정을 실행하여 잠재적 문제를 사전에 발견하고 해결하는 것이 필수적입니다.
  • 기술 부채 해소 기회: 마이그레이션은 CarrierWave, Sidekiq 등 오래된 의존성을 ActiveStorage, SolidQueue 등 최신 대안으로 교체하여 아키텍처를 간소화할 좋은 기회입니다.
  • 보안의 중요성: Rails 암호화된 자격 증명과 비밀번호 관리자 통합은 현대적인 보안 관행을 확립하는 데 기여합니다.
  • 최신 Rails의 가치: Importmaps, Kamal과 같은 Rails 8의 최신 툴링은 배포, 확장 및 유지보수를 현저히 단순화합니다.

결론

JuggleBee는 이번 마이그레이션을 통해 단순히 버전만 올린 것이 아니라, 애플리케이션 전체를 현대화하고 활력을 되찾았습니다. 그 결과, 애플리케이션은 더 빠르게 실행되고, 인프라는 더욱 간소해졌으며, 신뢰할 수 있는 배포 파이프라인을 구축하게 되었습니다. 점진적인 업그레이드 대신 Rails 8에서 새로 시작한 결정은 필요한 부분만 재구축하고 최신 도구를 활용하여 향후 수년간 JuggleBee를 안정적으로 운영할 수 있는 기반을 마련했습니다. 레거시 Rails 애플리케이션을 운영 중인 개발자들에게 이 경험은 마이그레이션의 가치와 성공적인 전략을 보여주는 좋은 사례가 될 것입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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