본문에서는 Rails 애플리케이션의 확장 여정을 5단계로 나누어 설명하며, 각 단계별 목표와 핵심 기술, 패턴 및 체크리스트를 제시합니다.
Stage 0: Day-1 MVP (1 → 1,000 사용자)
- 목표: 가치 제공, 낮은 복잡성 유지, 미래의 함정 회피.
- 기술: 모놀리식(Rails 7/8), PostgreSQL, Redis, Sidekiq, Turbo/Stimulus.
app/services
,app/queries
등의 패턴을 활용합니다. - 데이터 모델: UUID 기본 키, 시간대 포함 타임스탬프, 소프트 삭제, 멀티테넌시를 위한
tenant_id
. - 성능: Bullet Gem, 외래 키 및 자주 필터링되는 컬럼에 인덱스 추가, 프래그먼트 캐싱.
Stage 1: Early Traction (1,000 → 10,000 사용자)
- 목표: 실제 트래픽에서 빠른 페이지 속도 유지, 작업 안정화, PostgreSQL 부하 관리.
- 추가: CDN, ActiveStorage를 S3 호환 스토어로 전환, 페이지/프래그먼트 캐시 및 Russian-doll 캐싱.
- 백그라운드 작업: 모든 느린 경로를 Sidekiq으로, 외부 호출을 위한 멱등성 키 적용.
- PostgreSQL:
pg_stat_statements
활성화, 느린 쿼리 모니터링, 스마트 인덱스,SELECT *
피하기.
Stage 2: Fast Growth (10,000 → 100,000 사용자)
- 목표: 재작성 없이 읽기 및 트래픽 급증에 대비한 확장.
- 추가: PostgreSQL 읽기 복제본(Rails 7.1+ 멀티 DB 라우팅), 전체 페이지 캐싱, pg_trgm 기반 검색.
- 캐싱: 계산된 통계에 대한 저수준 캐싱, 비싼 쿼리에 대한 Write-through 캐시.
- 관찰 가능성: APM(New Relic/Datadog), 로그 집계, 사용자 정의 지표.
Stage 3: Heavy Usage (100,000 → 500,000 사용자)
- 목표: 데이터 관리 효율화, 안전한 마이그레이션, 성장을 위한 계획.
- 데이터베이스: 대규모 테이블 파티셔닝, 백그라운드 데이터 마이그레이션, 제로 다운타임 스키마 변경.
- API 경계: 모놀리스 내에서 내부 모듈(Billing, Search)을 Gem/Engine으로 추출, 도메인 이벤트(outbox pattern)를 통한 디커플링.
Stage 4: The Leap (500,000 → 1,000,000+ 사용자)
- 목표: 안정성과 비용 관리.
- 다중 지역 및 가용성: 지역별 읽기 복제본, 글로벌 CDN, Blue-green 또는 Canary 배포.
- 데이터: 핫/콜드 스토리지 분리, 샤딩은 필요할 때만 고려.
- 서비스 분리: 확장 프로필, 독립적인 릴리스 주기, 또는 주 서비스에 영향을 주는 외부 CPU/네트워크 부하가 있을 때만 고려.