4강예상 3분중급
[요약] Part 1. 마이그레이션의 3대 원칙
Part 1. 마이그레이션이란 무엇인가?의 핵심 내용을 불릿 포인트로 정리하고 복습하는 요약 회차입니다.
지금까지 데이터베이스 마이그레이션이 무엇인지, 왜 수작업으로 하면 안 되는지, 그리고 어떤 원리와 도구를 통해 코드로 관리해야 하는지 살펴보았습니다. Part 1의 핵심은 데이터베이스 스키마도 살아 숨 쉬는 소프트웨어의 일부이며, 애플리케이션 코드와 동일한 엄격한 관리 체계를 갖춰야 한다는 점입니다. 이번 요약 회차에서는 지금까지 배운 내용을 불릿 포인트로 짧고 굵게 복습하며 핵심 원칙을 머릿속에 각인시켜 봅니다.
첫 번째 원칙: 수작업 변경 절대 금지
운영 환경의 데이터베이스를 GUI 툴이나 일회성 쿼리로 직접 수정하는 것은 시한폭탄을 심는 것과 같습니다. 수작업을 피해야 하는 치명적인 이유는 다음과 같습니다.
- 추적 불가능 (No History)
- 변경 이력이 남지 않아 문제 발생 시 원인을 파악하기 힘듭니다.
- 시간이 지나면 왜 만들어졌는지 모르는 '좀비 컬럼'들이 생겨 스파게티 DB가 됩니다.
- 환경 간 불일치 (Environment Drift)
- 로컬, 테스트, 운영 서버 간의 데이터베이스 구조가 조금씩 어긋나게 됩니다.
- 이 불일치는 새로운 코드 배포 시 곧바로 대형 서버 장애로 직결됩니다.
- 협업의 붕괴 (Collaboration Conflicts)
- 여러 명이 동시에 스키마를 수정하면 덮어쓰기 현상이 발생합니다.
- 구두로 스키마 변경 사항을 공유하는 것은 실수와 누락을 낳습니다.
두 번째 원칙: 파일과 버전을 통한 코드화
수작업의 반대말은 자동화된 코드 형상 관리입니다. 데이터베이스 변경은 반드시 투명한 파일 시스템을 거쳐야 합니다.
- 독립적인 파일 단위 작성
- 스키마 변경 사항(테이블 생성, 컬럼 추가 등)을 단일 `.sql` 파일에 명시적으로 작성합니다.
- 이를 통해 Git 같은 버전 관리 시스템에 데이터베이스 변경 이력을 영구 보존합니다.
- 엄격한 고유 버전 번호 부여
- 파일명 앞에 타임스탬프(예: `20260712120000_`)나 일련번호를 붙여 실행 순서를 엄격하게 보장합니다.
- 순서가 꼬이면 DB 생성 과정이 완전히 망가지기 때문입니다.
- 메타 테이블을 통한 상태 추적
- 마이그레이션 도구는 DB 내부에 `schema_migrations` 같은 특별한 장부 테이블을 생성합니다.
- 이 장부를 통해 중복 실행을 막고, 어떤 환경에서든 알아서 누락된 스키마만 순차적으로 적용(Sync)합니다.
세 번째 원칙: 검증된 도구의 일관된 사용
파일 관리를 수작업으로 쉘 스크립트로 짜지 말고, 잘 만들어진 전용 도구를 사용해야 합니다.
- 전용 도구의 필수 기능 혜택
- 도구는 여러 서버가 동시에 마이그레이션을 시도할 때 충돌을 막는 락(Lock) 기능을 제공합니다.
- 오류 발생 시 롤백(Rollback)을 쉽게 할 수 있는 체계를 갖추고 있습니다.
- 생태계의 표준 도구 활용
- Go 생태계의 경우 `golang-migrate`, `Goose` 등 파일 기반의 명시적 쿼리 도구를 선호합니다.
- 무거운 복잡도를 피하고 쿼리를 투명하게 유지하기 위함입니다.
- 일관성 유지
- 프로젝트 중간에 마이그레이션 도구를 바꾸거나, 여러 도구를 섞어 쓰는 것은 재앙을 부릅니다.
- "하나의 데이터베이스에는 하나의 도구만 일관되게 접근하게 하라"는 규칙을 절대 어겨서는 안 됩니다.
Part 1 셀프 점검: 나는 제대로 하고 있는가?
- 새로운 컬럼을 추가할 때 DBeaver를 열지 않고, 에디터에서 빈 .sql 파일을 생성한다.
- 내가 만든 마이그레이션 파일이 Git 커밋 로그에 코드와 함께 포함되어 있다.
- 나의 로컬 DB와 운영 서버 DB 구조를 동기화하기 위해 버튼 클릭 한 번(명령어 한 번)이면 충분하다.
예시
-- 예시
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.다음 중 Part 1에서 강조한 마이그레이션의 핵심 원칙으로 가장 거리가 먼 것은 무엇인가요?
3줄 요약
- 1수작업 DB 변경은 이력 추적 실패와 배포 장애를 부르는 근본 원인이므로 엄격히 금지해야 합니다.
- 2스키마 변경은 반드시 버전 번호가 매겨진 파일(Code)로 관리하여 실행 순서를 통제해야 합니다.
- 3전용 마이그레이션 도구를 프로젝트 내내 일관성 있게 사용하여 모든 환경의 스키마를 완벽히 동기화하세요.