Rails의 스와퍼블 마이그레이션 백엔드: Shopify의 대규모 데이터베이스 관리 전략

Rails’s Swappable Migration Backend for Schema Changes at Scale

작성자
발행일
2025년 12월 08일

핵심 요약

  • 1 Rails 7.0에 도입된 스와퍼블 마이그레이션 백엔드는 애플리케이션이 마이그레이션 실행 방식을 유연하게 맞춤 설정할 수 있도록 지원합니다.
  • 2 Shopify는 이 기능을 활용하여 프로덕션 환경에서 안전성 검사, JSON 직렬화 및 중앙 집중식 서비스 제출을 통해 대규모 데이터베이스 마이그레이션을 안전하게 관리합니다.
  • 3 이 새로운 접근 방식은 기존의 복잡한 몽키 패치와 취약한 SQL 파싱 방식의 한계를 극복하고, 마이그레이션 처리의 우아함과 유지보수성을 크게 향상시켰습니다.

도입

Rails 7.0에 도입된 '스와퍼블 마이그레이션 백엔드'는 애플리케이션이 데이터베이스 마이그레이션 실행 방식을 맞춤 설정할 수 있도록 지원하는 핵심 기능입니다. 이 기능은 특히 Shopify와 같이 매주 수백 개의 마이그레이션을 실행하며 무중단 배포가 필수적인 대규모 환경에서 필요성이 부각되었습니다. 기존에는 복잡한 몽키 패치와 취약한 SQL 파서를 통해 마이그레이션을 처리했으나, 이러한 방식의 한계를 극복하고 Rails 프레임워크 자체에 유연한 마이그레이션 실행 전략을 도입하게 된 배경과 그 구현 과정을 다룹니다.

프로덕션 마이그레이션의 도전과 Rails의 해결책

Shopify는 대규모 Rails 애플리케이션에서 무중단 데이터베이스 마이그레이션을 수행해야 하는 과제에 직면했습니다. 프로덕션에서는 테이블 잠금 없는 온라인 스키마 마이그레이션(LHM)이 필수적이며, 기존의 복잡한 몽키 패치와 취약한 RACC SQL 파서 기반 구현은 한계가 있었습니다.

Rails 스와퍼블 마이그레이션 전략 도입 (Rails 7.0)

Shopify의 Rails Infrastructure 팀은 이 문제를 해결하고자 Rails 프레임워크에 ‘전략 패턴’ 기반의 스와퍼블 마이그레이션 백엔드를 제안하고 구현했습니다. 이 패턴은 마이그레이션과 데이터베이스 연결 어댑터 사이에 전략 객체를 두어 실행 방식을 유연하게 제어합니다.

  • 기본 전략: ActiveRecord::Migration::DefaultStrategy는 마이그레이션 메서드를 연결에 직접 전달하여 SQL을 실행합니다.

  • 사용자 정의 전략: config.active_record.migration_strategy를 통해 JsonSerializationStrategy 같은 사용자 정의 전략을 설정할 수 있습니다. Shopify는 이를 활용, 스키마 변경 작업을 JSON 페이로드로 직렬화하여 중앙 서비스로 제출, 안전성 검사 및 실행을 위임합니다. 이 설정은 schema_migrations Gem 이니셜라이저를 통해 프로덕션 환경에 자동 적용됩니다.

안전성 검사 및 다중 DB 지원 강화

기존 SQL 파서 기반 안전성 검사의 취약점을 개선하고자 MigrationOperationRecorder를 개발, 마이그레이션 시 호출되는 메서드와 인수를 기록하고 이 데이터를 기반으로 다양한 안전성 검사를 수행합니다. 이 method_missing 기반 기록 방식은 실행 전략과 분리되어 모든 환경에서 일관된 안전성 검사를 가능하게 합니다. 또한, 다중 데이터베이스 시스템 지원을 위해 Rails 8.2부터는 어댑터별 마이그레이션 전략 등록 기능이 추가되어, 각 DB 유형에 맞는 맞춤형 처리가 더욱 용이해질 예정입니다.

결론

Rails의 스와퍼블 마이그레이션 백엔드 기능은 '설정보다 관례'라는 Rails의 철학을 따르면서도, Shopify와 같은 대규모 사용자에게 필요한 유연성을 제공합니다. 이는 복잡한 내부 패치 없이 마이그레이션 실행 방식을 커스터마이징할 수 있는 명확한 확장 지점을 제공합니다. Shopify는 이 기능을 통해 안전하고 효율적인 대규모 데이터베이스 마이그레이션을 달성했으며, 동시에 Rails 커뮤니티에 새로운 도구를 기여하여 오픈 소스 협업의 긍정적인 사례를 보여주었습니다. 이는 특정 사용 사례의 한계를 해결하면서도 더 넓은 커뮤니티에 이점을 제공하는 상류 기여의 중요성을 강조합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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