본문 바로가기
C.W.K.
Stream
Lesson 10 of 13 · published

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

~12 min · migrations, schema, downtime

Level 0견습생
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

새벽 3시에 깨우는 작업

데이터베이스 마이그레이션은 배포가 죽으러 가는 곳이야. 코드는 초 단위로 앞으로 굴러가지만, 스키마는 제거하기 전까지 계속 살아남아. 마이그레이션 순서를 잘못 맞추면 배포 롤백으로도 되돌릴 수 없는 서비스 중단이 발생해.

확장-수축 패턴

옛 코드와 새 코드 둘 다 쓰는 데이터를 다루는 마이그레이션은 이렇게 해:

  1. 확장 — 새 컬럼, 테이블, 인덱스를 추가해. 옛 코드는 무시하고 새 코드는 바로 사용할 수 있어. 하위 호환성을 유지하지.
  2. 이주 — 새 구조에 데이터를 백필해. 보통 배포 과정이 아니라 별도의 백그라운드 작업으로 처리해.
  3. 전환 — 새 구조로 읽고 쓰는 코드를 배포해. 옛 코드도 여전히 작동하도록 허용해.
  4. 수축 — 모든 코드가 100% 새 구조를 사용하면 (그리고 한 릴리스 주기 동안 유지한 뒤) 옛 컬럼이나 테이블을 삭제해.

마이그레이션 러너 위치

  • 배포 전 작업 — 새 코드가 사용자에게 닿기 전에 마이그레이션을 돌려. 추가(확장) 마이그레이션에 안전해.
  • 앱 시작 — 코드가 부팅될 때 마이그레이션을 돌려. 위험해: 여러 인스턴스가 동시에 시작되면 경쟁 상태가 발생하고, 콜드 스타트가 길어져.
  • 수동 / 필요 시 — 파괴적인 마이그레이션(컬럼 삭제)은 수동 승인 뒤에 통제를 거쳐, 배포와 별도로 실행해.

Code

사전 배포 마이그레이션 작업·yaml
  migrate:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: production
    permissions:
      id-token: write
    steps:
      - uses: actions/checkout@v4
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123:role/gha-migrate
          aws-region: us-east-1
      - run: |
          # Run only additive migrations here.
          # Destructive ones live in a separate manual workflow.
          DATABASE_URL=$(aws ssm get-parameter --name /prod/db-url --with-decryption --query Parameter.Value --output text)
          DATABASE_URL="$DATABASE_URL" alembic upgrade head

  deploy:
    needs: migrate
    runs-on: ubuntu-latest
    environment: production
    steps:
      - run: ./deploy.sh

External links

Exercise

최근 5개 마이그레이션을 점검해. 각각 확장 / 이주 / 전환 / 수축으로 분류해봐. 하나의 PR에 두 단계를 합친 거 찾기 (사건의 흔한 원인이야). 다르게 할 거 적어봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.