MMeshOps
데이터베이스 마이그레이션 실전: 다운타임 없는 안전한 DB 변경
7예상 10중급

되돌아갈 수 있는가? 롤백(Rollback) 가능성 검토

문제가 발생했을 때 이전 상태로 안전하게 되돌아가기 위한 롤백 전략과 데이터 보존 방안을 검토합니다.

우리는 항상 완벽을 기하지만, 운영 환경에서는 예상치 못한 버그가 언제든 발생할 수 있습니다. 마이그레이션을 실행하고 새로운 코드를 배포했는데 치명적인 오류가 생겼다면 어떻게 해야 할까요? 재빨리 이전 상태로 되돌리는 것(Rollback)이 최우선입니다. 이번 시간에는 마이그레이션에서 롤백을 어떻게 준비하고 실행하는지 알아봅니다.

마이그레이션의 양방향성: Up과 Down

좋은 데이터베이스 마이그레이션 도구들은 항상 '적용(Up)''취소(Down)'라는 두 가지 방향을 지원합니다.

마이그레이션을 적용하여 데이터베이스를 최신 상태로 만드는 과정을 보통 Up 스크립트라고 부릅니다. 반대로, 문제가 생겼을 때 직전 상태로 스키마를 되돌리는 과정을 Down 스크립트라고 합니다.

Down 스크립트 작성의 중요성

일반적으로 개발할 때는 Up 스크립트 작성에만 집중하기 쉽습니다. "테이블을 만들면 그만이지, 왜 지우는 쿼리까지 미리 짜야 해?"라고 생각할 수 있죠.

하지만 마이그레이션은 버전을 관리하는 시스템입니다. 코드 버전 관리 도구인 Git에서 `git revert`로 이전 커밋으로 되돌리듯이, DB 스키마도 이전 버전으로 깨끗하게 되돌아갈 수 있어야 합니다.

Up과 Down 스크립트의 짝꿍

sql
```sql
-- 001_create_users_table.up.sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50)
);

-- 001_create_users_table.down.sql
DROP TABLE users;
```
  1. 1Up 스크립트: 001_create_users_table.up.sql - CREATE TABLE users (...)
  2. 2Down 스크립트: 001_create_users_table.down.sql - DROP TABLE users

Down 스크립트를 작성해두면, 배포 실패 시 `migrate down` 명령어 하나로 DB 스키마를 이전 버전으로 즉시 롤백할 수 있습니다. 수작업으로 어떤 테이블을 지워야 하는지 당황하며 찾을 필요가 없습니다.

모든 롤백이 완벽한 것은 아니다

여기서 한 가지 매우 중요한 딜레마가 발생합니다. 스키마 구조는 되돌릴 수 있지만, 삭제된 데이터는 되돌릴 수 없다는 점입니다.

롤백과 데이터의 관계

단순한 테이블 생성(Up) 후 롤백(Down)

생성했던 빈 테이블이 삭제되므로 아무런 데이터 유실이 없음

컬럼 삭제(Up) 후 롤백(Down)

컬럼 껍데기는 다시 생기지만, 삭제될 때 날아간 데이터는 복구되지 않음

예를 들어, `phone_number` 컬럼을 지우는 마이그레이션(Up)을 실행했다고 가정해봅시다. 나중에 아차 싶어서 롤백(Down)을 실행하면, 테이블에 `phone_number` 컬럼이 다시 생기긴 합니다. 하지만 그 안에 들어있던 고객들의 실제 전화번호 데이터는 이미 날아가고 텅 빈 상태로 복구됩니다.

데이터 보존을 위한 방어적 마이그레이션

이러한 문제 때문에, 실무에서는 롤백 시 데이터가 유실될 수 있는 파괴적인 마이그레이션(DROP, ALTER)을 최대한 뒤로 미루는 전략을 사용합니다.

  1. 컬럼 추가/테이블 생성: 마음껏 합니다. 롤백해도 빈 껍데기만 지워지니 안전합니다.
  2. 데이터 복사/변환: 기존 컬럼을 둔 채, 새로운 컬럼에 데이터를 복사합니다. 롤백하면 새 컬럼만 지우면 됩니다. 기존 데이터는 안전합니다.
  3. 컬럼 삭제: 구버전 컬럼을 지우는 것은 충분한 시간(며칠~몇 주)이 지나고, 앱이 완벽하게 안정화된 후에 가장 마지막 마이그레이션으로 독립시켜 실행합니다.

이렇게 하면 배포 직후 장애가 발생해 긴급 롤백을 하더라도, 삭제된 데이터가 없기 때문에 100% 완벽한 원상 복구가 가능합니다.

실무의 롤백 테스트

노련한 개발팀은 마이그레이션 스크립트를 작성한 뒤 개발 환경에서 반드시 적용(Up)과 롤백(Down)을 반복해서 실행해봅니다. `Up -> Down -> Up`을 거쳤을 때 스키마가 처음 의도한 대로 완벽히 만들어지는지 확인하는 것이죠. 롤백 스크립트는 화재 대피로와 같습니다. 불이 나기 전에 문이 열리는지 확인해야 합니다.

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

Down 스크립트(롤백 스크립트)와 관련하여 가장 올바른 설명은 무엇인가요?

3줄 요약

  1. 1좋은 마이그레이션은 적용(Up)뿐만 아니라 취소(Down) 스크립트도 짝을 이뤄 작성해야 합니다.
  2. 2스키마 구조는 롤백할 수 있지만, 한 번 삭제(DROP)된 데이터는 롤백으로 복구되지 않습니다.
  3. 3데이터 유실 없는 안전한 롤백을 위해 파괴적인 변경 작업은 최대한 나중으로 미루는 것이 좋습니다.