8.5 DB 마이그레이션 (Flyway)
스키마·데이터 변경을 버전 관리하고, 배포 시 자동으로 적용하려면 Flyway (또는 Liquibase)를 사용합니다. SQL 스크립트를 버전 번호로 관리해, 누락·충돌 없이 DB를 갱신할 수 있습니다.
작성 기준: Spring Boot 3.2.x, Flyway
1. 의존성 및 기본 동작
implementation 'org.flywaydb:flyway-core'
implementation 'org.flywaydb:flyway-mysql' // MySQL 사용 시 (선택)
- Spring Boot는 flyway-core만 넣어도 자동 설정으로 Flyway를 활성화합니다.
- spring.flyway.enabled=true (기본값). 끄려면
false로 설정합니다.
2. 마이그레이션 스크립트 위치와 네이밍
기본 경로: src/main/resources/db/migration/
파일 이름 규칙: V{버전}__{설명}.sql
- V: 버전 마이그레이션 (필수)
- 버전: 숫자 또는 숫자.숫자 (예: 1, 1.1, 2_0)
- __: 언더스코어 두 개 (구분자)
- 설명: 자유 (영문 권장)
예시:
V1__create_members_table.sqlV2__add_email_to_members.sqlV3__create_orders_table.sql
3. 스크립트 예시
V1__create_members_table.sql
CREATE TABLE members (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
V2__add_email_to_members.sql
ALTER TABLE members ADD COLUMN phone VARCHAR(20);
CREATE INDEX idx_members_email ON members(email);
- 한 번 성공 적용된 버전은 flyway_schema_history에 기록되어 재실행되지 않습니다.
- 기존 DB에 Flyway를 도입할 때는 V1을 “현재 스키마를 반영한 baseline”으로 두거나, flyway baseline을 사용합니다.
4. application.yml 설정
spring:
flyway:
enabled: true
locations: classpath:db/migration
baseline-on-migrate: true # 기존 DB에 처음 적용 시
- baseline-on-migrate: true: 테이블이 이미 있을 때, 현재를 baseline으로 두고 그 다음 버전부터 적용합니다.
- locations: 스크립트 경로. 여러 경로 지정 가능.
5. 프로파일별 비활성화
테스트에서 H2를 쓰고 Flyway를 돌리지 않을 때:
# application-test.yml
spring:
flyway:
enabled: false
6. 정리
- 순서: 버전 번호 순으로 적용. 중간에 새 버전을 끼워 넣는 것은 가능하지만, 이미 적용된 버전의 내용을 바꾸면 안 됩니다.
- 되돌리기: Flyway Community는 undo가 없습니다. 롤백이 필요하면 새 마이그레이션으로 ALTER/DROP을 작성하는 방식이 일반적입니다.
팁
팀에서 스키마 변경은 반드시 Flyway 스크립트로 하고, 로컬·CI·운영이 같은 스크립트를 적용하도록 하면 “내 DB에서만 됐는데…” 문제를 줄일 수 있습니다.