대규모 Rails 애플리케이션의 스키마 마이그레이션 관리: Intercom 사례

Miles McGuire - Taming the Beast: Safely Managing Database Operations in Rails in a Team of 100s

작성자
Ruby on Rails Youtube
발행일
2025년 09월 16일

핵심 요약

  • 1 Intercom은 대규모 Rails 환경에서 스키마 마이그레이션의 안전성과 개발자 생산성을 높이기 위해 체크리스트, RuboCop 린팅, 런타임 검증을 포함한 다단계 방어 체계를 구축했습니다.
  • 2 MySQL의 비원자적 DDL 특성과 대용량 테이블 변경의 위험을 관리하고자, 마이그레이션 명령어 분석을 통해 위험 작업을 사전에 차단하거나 안전한 방식으로 자동 전환하는 시스템을 개발했습니다.
  • 3 개발 초기에는 빠른 반복에 집중하고, 규모가 커질수록 발생하는 문제로부터 학습하여 자동화된 도구로 반복적인 실수를 방지하는 것이 중요하며, 운영 환경에서의 런타임 검증이 가장 효과적인 방안임을 제시합니다.

도입

Intercom은 수백 테라바이트의 관계형 데이터와 수십억 개의 행을 가진 테이블을 운영하는 대규모 Ruby on Rails 애플리케이션입니다. 이러한 환경에서 스키마 마이그레이션은 애플리케이션 가용성과 데이터 안전성을 보장하는 핵심 요소이자 개발자 생산성에 큰 영향을 미칩니다. 본 발표는 Intercom이 마이그레이션 과정에서 겪었던 문제점들을 바탕으로, 개발자들이 Rails의 일반적인 관용구를 사용하면서도 대규모 환경의 복잡성을 안전하게 다룰 수 있도록 구축한 다단계 방어 전략을 소개합니다. 이는 단순한 체크리스트를 넘어 코드 린팅과 런타임 검증을 통해 잠재적 위험을 사전에 차단하는 데 중점을 둡니다.

Intercom은 대규모 Rails 환경의 스키마 마이그레이션 안전성 확보를 위해 다단계 방어 전략을 구축했습니다.### 1. 체크리스트 및 Runbook초기에는 체크리스트로 일반 위험을 문서화하고 GitHub PR에 자동 게시했습니다. MySQL 비원자적 DDL 특성을 고려한 change_table set bulk: true 사용을 권장했으나, 한계가 있었습니다.### 2. RuboCop을 활용한 코드 린팅 (개발 단계 예방)개발 단계에서 RuboCop 커스텀 규칙을 도입, 비원자적 DDL 작업 통합, BigInt 외부 키 강제, execute 메서드 사용 금지 등 잠재적 위험을 사전에 감지합니다.### 3. 런타임 검증 (운영 환경 보호)가장 중요한 런타임 검증은 실제 운영 환경에서 ActiveRecord::Migration 몽키 패치와 ActiveRecord::CommandRecorder를 활용해 마이그레이션 명령어를 동적으로 분석합니다. 500만 행/5GB 이상 대용량 테이블 변경 차단, execute 호출 금지, 대용량 테이블 삭제 시 안전한 이름 변경, change_column 사용 금지 및 “확장-축소” 모델 권장 등 휴리스틱 기반으로 안전을 확보합니다. 숙련된 운영자를 위한 우회 기능도 제공됩니다.이 통합 접근 방식은 Rails 표준을 따르면서도 대규모 환경의 복잡하고 위험한 마이그레이션 문제를 효과적으로 관리하도록 지원합니다.

결론

Intercom은 체크리스트, RuboCop 린팅, `ActiveRecord::Migration` 몽키 패치를 활용한 런타임 검증 등 다층적 접근 방식으로 대규모 Rails 앱의 스키마 마이그레이션 안전성과 개발자 생산성을 크게 향상시켰습니다. 특히 운영 환경의 컨텍스트를 활용하는 런타임 검증은 잠재적 위험을 효과적으로 차단하는 '골드 스탠다드'로 평가됩니다. 현재 PlanetScale로 전환 중이며, 이는 기존 커스텀 도구의 필요성을 줄이고 새로운 마이그레이션 워크플로우를 제공할 것입니다. 이 사례는 대규모 시스템에서 자동화 및 프로세스 개선을 통한 생산성 및 안전성 확보의 중요성을 보여줍니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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