Go로 백엔드를 개발할 때 GORM의 마이그레이션 기능은 정말 편리하다.
하지만 무턱대고 자동 마이그레이션만 쓰다 보면 데이터 유실, 인덱스 충돌, 운영 장애까지 발생할 수 있다.
이번 글에서는 GORM에서 자동 마이그레이션과 수동 마이그레이션을 언제 어떻게 써야 하는지, 실전 전략을 정리해보자.
📌 목차
- GORM AutoMigrate 기본 사용법
- 자동 마이그레이션의 한계와 리스크
- 수동 마이그레이션 관리 전략
- 실전 추천 전략 (개발/운영 구분)
- 마무리 요약
1. GORM AutoMigrate 기본 사용법
GORM은 AutoMigrate()로 테이블을 생성하고 컬럼을 자동으로 추가해준다.
db.AutoMigrate(&User{}, &Post{})
- 존재하지 않는 테이블이면 생성
- 컬럼이 없으면 추가됨
- 인덱스도 일부 생성됨
✅ 장점: 빠르고 간편함
❌ 단점: "삭제"나 "변경"은 절대 하지 않음
2. 자동 마이그레이션의 한계와 리스크
🚨 컬럼 변경 or 삭제 안 됨
type User struct {
Name string `gorm:"size:100"`
}
기존에 size:255로 생성된 name 컬럼이 있어도,
AutoMigrate는 이를 수정하지 않는다. → 스키마와 모델 불일치
❌ 인덱스 수정도 안 됨
- 기존 인덱스를 변경하려 해도 무시됨
- 중복 인덱스 발생 위험 있음
🧨 운영환경에서 실수로 실행하면?
- 예상 못한 구조로 테이블이 생성될 수 있음
- 예: 관계 설정이 빠져서 FK 없이 테이블 생성
3. 수동 마이그레이션 관리 전략
실무에서는 마이그레이션 스크립트를 버전별로 관리하는 게 일반적이다.
📦 golang-migrate 사용 예시
- 설치
brew install golang-migrate
- 마이그레이션 생성
migrate create -ext sql -dir db/migrations create_users_table
- 스크립트 작성
-- db/migrations/001_create_users_table.up.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
- 실행
migrate -path db/migrations -database "postgres://user:pass@localhost:5432/dbname?sslmode=disable" up
GORM과 별도로 DB 버전을 명확히 관리할 수 있음
실시간 롤백도 가능 (down.sql 사용)
4. 실전 추천 전략 (개발 vs 운영 분리)
환경 | 추천 방식 | 이유 |
개발 | AutoMigrate() 사용 | 빠른 테스트, 초기 테이블 생성에 유용 |
운영 | golang-migrate 등 수동 관리 | DB 구조 통제, 검증된 스크립트만 반영 가능 |
💡 개발 단계에서 생성된 모델을 기반으로 SQL을 추출하고, 운영에서는 반드시 수동 반영하자.
5. 마무리 요약
전략 | 설명 |
AutoMigrate | 빠르게 모델 기반 테이블 생성 (단, 변경/삭제는 안 됨) |
수동 마이그레이션 | SQL 스크립트 기반 버전 관리, 안정적 운영에 필수 |
운영환경 적용시 | 사전 검토된 수동 마이그레이션만 적용 권장 |
'개발 > Go' 카테고리의 다른 글
[Gin] GORM으로 단위 테스트 잘하는 법 - 테스트 환경 구성부터 Mock까지 (70) | 2025.06.11 |
---|---|
[Gin] GORM에서 안전한 쿼리 작성법 - SQL 인젝션 방지와 Named Parameter 전략 (69) | 2025.06.09 |
[Gin] GORM 성능 최적화 팁 - Preload, Select, Index 전략까지! (64) | 2025.06.04 |
[Gin] GORM 고급 기능 완전 정복 - Soft Delete, Hook, 트랜잭션까지! (99) | 2025.05.28 |
[Gin] GORM 관계 설정 완전 정복 - 1:N, N:1, N:M 예제로 배우기 (60) | 2025.05.26 |