이번 글에서는
DB Migration
도구인Flyway
에 대해 정리해 보려고 합니다.
Flyway
는 데이터베이스를 변경하고, 변경 이력을 관리해주는 DB Migration
도구입니다.
소스 코드를 관리하는 Git
처럼 Flyway는 변경 이력을 버전으로 관리하고,
변경 이력 history도 확인할 수 있습니다.
간단한 코드로 예시를 들어 설명하겠습니다.
// Before
@Entity
class User(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
val name: String,
)
// After
@Entity
class User(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
val name: String,
val profileImage: String
)
요구사항이 변경되어 User 엔티티에 profileImage
를 추가해야되는 상황입니다.
위 예시처럼 프로젝트를 진행하다보면 DB 관련 변경이 자주 일어납니다.
참고로 개발, 운영 환경에서의 hibernate ddl-auto
는 개발자의 실수를 막기 위해 validate
로 설정했습니다.
spring:
jpa:
hibernate:
ddl-auto: validate
그렇기 때문에 요구사항이 변경될 때마다 매번 개발, 운영 서버에 테이블 변경 DDL을 작성해야 하는 번거로움이 존재했고, 개발자가 충분히 실수할 수 있는 상황이였습니다.
요구사항이 추가되어 테이블을 추가할 때도 마찬가지입니다.
그래서 이와 같은 번거로움을 해결해주는 도구를 찾다가
자바 진영 DB 관리 도구인 Flyway
, Liquibase
를 알게되었습니다.
둘 중에서 문서화가 잘 되어있고, 관련 자료가 많은 Flyway
를 선택했습니다.
한 줄 요약: 번거롭고 실수를 유발하는 DB 변경 관리를 자동화해 주는
Flyway
적용
프로젝트에서는 Spring Boot
, Gradle
, MySQL
을 사용했고,
프로젝트 진행 중(데이터 존재)에 적용했습니다.
// MySQL 8 버전이상, MariaDB 사용
implementation("org.flywaydb:flyway-mysql:10.8.1")
// else
implementation("org.flywaydb:flyway-core:10.8.1")
spring:
flyway:
enabled: true # Flyway 활성화
baseline-on-migrate: true # Flyway가 제공하는 변경 이력 테이블 자동 생성
baseline-version: 0 # 초기 버전 설정
설정 후 Spring Boot를 실행해보면 Flyway
가 제공하는 변경 이력 테이블 자동 생성된 것을 확인할 수 있습니다.
이제 Flyway
가 제공하는 규칙으로 DB 변경 사항을 파일로 작성하면 DB에 자동으로
적용 될 것입니다.
파일은 src/main/resources/db/migration
경로에 생성해야 합니다.(수정 가능)
파일명은 (Prefix)(Version)__(Description).sql 형식으로 작성하면 됩니다.
그리고 버전을 명시할 때는 이전 버전보다 항상 높아야 하며, 마이그레이션 파일을 수정하거나 지우면 안됩니다.
// V1__add_user_profile_image.sql
alter table user add column profile_image varchar(255) not null;
// V2__add_user_age.sql
alter table user add age int not null;
Flyway
를 직접 사용해 보면서 편하다는 생각이 가장 먼저 들었습니다.
매번 개발, 운영 환경에 접속해 각각 DDL을 작성하는게 불편했는데, 마이그레이션 파일 하나로 두 서버에 DDL이 자동으로 작성되니까 시간이 절약되고, 생산성이 크게 향상되었습니다.
실무에서 DBA를 맡으신 분이 계신다면 불필요한 기술이겠지만, 토이 프로젝트와 같이 서버, DB를 모두 백엔드가 관리한다면 Flyway
를 도입해도 괜찮을 것 같습니다!
https://documentation.red-gate.com/flyway
https://github.com/devcsb/flyway?tab=readme-ov-file
https://velog.io/@banjjoknim/DB-Migration-Tool#naming-strategy-%EC%84%A4%EC%A0%95