공식 도큐먼트
https://flywaydb.org/documentation/usage/gradle/
Flyway는 데이터베이스용 Git으로 DB 버전 관리 오픈소스 툴입니다.
대부분의 프로젝트는 local, dev(test), prod와 같이 다수의 환경을 가지고 있습니다.
project_root/sql/USER.sql
이전에는 위와 같이 스크립트 파일을 관리하고 일일이 로컬/개발/베타/운영 DBMS에서 각각 실행하였습니다.
그러나 이 경우에서는 개발 DB에서 변경한 Schema, Index등이 베타 DB에 누락되는 등의 실수가 발생할 수 있고 이는 장애로 이어질 수 있습니다.
이처럼 한 프로젝트의 변경된 DB 스키마 이력을 확인할 수 없다면 동일한 데이터베이스 환경을 구성하기 어렵습니다.
이 때 Flyway를 사용하여 실수를 방지할 수 있습니다.
Flyway updates a database from one version to the next using migrations.
Flyway는 한 버전으로부터 데이터베이스 마이그레이션을 수행합니다.
스키마 마이그레이션은 버전 정보를 확인 후 데이터베이스의 스키마를 최신으로 업데이트할 필요가 있을 때마다 데이터베이스를 업데이트하는 작업을 말합니다.
최신보다 높은 버전으로 변경 사항 스크립트 파일이 작성되면 이를 반영하여 DB를 변경하게 됩니다.
이때 flyway_schema_history 테이블에 스키마 변경 이력이 쌓이게 됩니다.
build.gradle
implementation 'org.flywaydb:flyway-core:7.15.0'
main/application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3307/jagoga_db?serverTimezone=UTC&characterEncoding=UTF-8
username: admin
password: jagogaqwer1234
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: none
properties:
hibernate:
# show_sql: true
format_sql: true
flyway:
baseline-version: 1
flyway에 db 접속정보를 입력하지 않아도spring.datasource에 설정된 접속 정보를 통해서 마이그레이션이 가능합니다.
resources/db/migration/V1__base.sql
create table users (
user_id BIGINT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
name VARCHAR(30) NOT NULL,
password VARCHAR(255) NOT NULL,
phone VARCHAR(20) NOT NULL,
role VARCHAR(10) NOT NULL,
created_at DATETIME,
modified_at DATETIME,
UNIQUE INDEX ux_email (email)
) engine=InnoDB default character set = utf8;
스키마가 변경되는 일이 있을 경우 위 처럼 버전 명시한 sql 파일만 추가해주면 됩니다.
파일명 규칙
V + 버전 + __ + 설명.sql
파일 위치
src/main/resources/db/migration/V1__description.sql
flyway가 스크립트 파일을 인식하려면 위 경로에 존재해야 합니다.
test/application.yml
spring:
datasource:
url: jdbc:h2:mem:test;MODE=MYSQL;
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
show_sql: true
테스트 코드 실행시 h2 DB를 사용하는데 스크립트 언어는 MySQL 문법으로 작성되어있어 테이블 drop & create시 문법 오류 발생합니다.
따라서 h2 DB 모드와 JPA Dialect를 MySQL로 설정하였습니다.
애플리케이션 실행시 flyway_schema_history 테이블에 스키마 변경 이력이 쌓이고 데이터베이스에 테이블이 추가된 것을 확인할 수 있습니다.
테이블 및 컬럼 등 변경사항이 생기는 경우 위와 같이 버전 업 sql 파일 생성 후 애플리케이션을 실행해주면 아래와 같이 flyway_schema_history 테이블에 변경 이력이 쌓이고 데이터베이스에 변경 내역이 반영됩니다.
https://github.com/iinow/flyway
https://sabarada.tistory.com/193
https://meetup.toast.com/posts/173