-
Notifications
You must be signed in to change notification settings - Fork 28
flyway 실전편
// v1
drop table if exists account;
create table account
(
id bigint auto_increment,
primary key (id)
);
// v2
alter table account add column age integer default 0;
alter table account add column name varchar(255);
// v3
alter table account drop name;
// v4
insert into account
values (1, 3);
insert into account
values (2, 4);
insert into account
values (3, 5);
dependencies {
// ...
implementation 'org.flywaydb:flyway-core' // 추가
implementation 'org.flywaydb:flyway-mysql' // 추가
}
flyway를 사용한다면 core를 추가, MySQL을 사용하므로 flyway-mysql 추가해야합니다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/practice
username: root
password: 1234
jpa:
generate-ddl: false
flyway:
enabled: true
baseline-version: 0
out-of-order: true
baseline-version 의 default 값은 1입니다.
intellij 로 애플리케이션 실행하게 되면 baseline-version 이 제대로 실행되지 않는 것을 알 수 있습니다. 즉, script version v1 부터 순차대로 읽습니다.
아래 gradle build 와 비교해보겠습니다.
// 추가
buildscript {
dependencies {
classpath 'org.flywaydb:flyway-mysql:9.16.3'
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.10'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id "org.flywaydb.flyway" version "9.16.3" // 추가
}
// 추가
flyway {
url = 'jdbc:mysql://localhost:3306/practice'
user = 'root'
password = 1234
baselineVersion = 0
outOfOrder = true
}
flyway 옵션을 하나씩 살펴보겠습니다.
baselineVersion 은 어느 스크립트부터 읽을 것인지 baseline version
을 지정해줍니다.
만약 0이라면 V1부터, 1이면 V2부터 스크립트를 읽고, default 값은 1입니다.
그래서 지금 flyway script 는 V1부터 시작하기 때문에 version을 0으로 설정하겠습니다.
baseline 을 설정하는 gradle 명령어
./gradlew flywayBaseline
version 이 0부터 시작하기 때문에 V1 스크립트부터 실행됩니다.
하지만 위에서 말했듯이 intellij 로 애플리케이션을 실행하면 Baseline이 따로 만들어지지 않고, V1부터 실행됩니다.
이제 migration 을 해보겠습니다.
./gradlew flywayMigrate -i
-i 옵션은 history 가 어떻게 추가됐는지 추가 로그를 보여줍니다.
이제 clean을 해보겠습니다.
script 를 통해 생성된 테이블과 history 가 전부 삭제됩니다.
cleanDisabled = false
cleanDisabled default 값은 true이기 때문에 false 로 변경해줘야합니다.
true면 clean 명령어가 동작하지 않습니다.(flyway 에서 아예 막아두었습니다)
./gradlew flywayClean
제대로 삭제됨을 알 수 있습니다.