📦

Migrations (마이그레이션)

코드로 데이터베이스 스키마를 버전 관리

Migration은 데이터베이스 스키마 변경을 Ruby 코드로 관리하는 시스템입니다. SQL을 직접 실행하는 대신, Migration 파일을 작성하고 rails db:migrate로 적용합니다.

# db/migrate/20240101000000_create_posts.rb
class CreatePosts < ActiveRecord::Migration[8.0]
  def change
    create_table :posts do |t|
      t.string :title, null: false
      t.text :content
      t.references :user, null: false, foreign_key: true
      t.string :status, default: 'draft'
      t.timestamps  # created_at, updated_at 자동 추가
    end

    add_index :posts, :status
  end
end

주요 명령어:

  • rails db:migrate — 미적용 마이그레이션 실행

  • rails db:rollback — 마지막 마이그레이션 되돌리기

  • rails db:migrate:status — 마이그레이션 적용 상태 확인

파일명의 타임스탬프(20240101000000)로 실행 순서가 결정되며, schema_migrations 테이블에 적용된 마이그레이션이 기록됩니다.

핵심 포인트

1

rails generate migration CreatePosts title:string content:text → 마이그레이션 파일 생성

2

생성된 파일에서 change 메서드에 스키마 변경 정의

3

create_table, add_column, remove_column, rename_column 등 DSL 사용

4

rails db:migrate 실행 → SQL로 변환되어 DB에 적용

5

db/schema.rb가 자동 업데이트 (현재 스키마 스냅샷)

6

rails db:rollback으로 되돌리기 가능 (change 메서드는 자동 역전)

장점

  • DB 스키마를 Git으로 버전 관리
  • 팀원 간 스키마 동기화 자동화
  • change 메서드로 자동 롤백 지원
  • DB 종류에 독립적인 DSL

단점

  • 프로덕션 마이그레이션은 신중해야 함 (데이터 손실 위험)
  • 대용량 테이블 마이그레이션은 시간이 오래 걸림
  • down 메서드가 없으면 롤백 불가
  • 마이그레이션 파일이 계속 쌓임

사용 사례

테이블 생성/삭제 컬럼 추가/수정/삭제 인덱스 추가 외래키 설정 팀 간 스키마 동기화