Skip to content

flyway 실전편

HyeonWoo Kim edited this page Apr 18, 2023 · 1 revision

Script Version

// 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);

Spring에서의 flyway

dependency

dependencies {

	// ...

	implementation 'org.flywaydb:flyway-core' // 추가
	implementation 'org.flywaydb:flyway-mysql' // 추가
}

공식문서

flyway를 사용한다면 core를 추가, MySQL을 사용하므로 flyway-mysql 추가해야합니다.

yml

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 와 비교해보겠습니다.

gradle build에서의 flyway

// 추가
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
}

baseline 설정

flyway 옵션을 하나씩 살펴보겠습니다.

baselineVersion 은 어느 스크립트부터 읽을 것인지 baseline version 을 지정해줍니다.

만약 0이라면 V1부터, 1이면 V2부터 스크립트를 읽고, default 값은 1입니다.

그래서 지금 flyway script 는 V1부터 시작하기 때문에 version을 0으로 설정하겠습니다.

baseline 을 설정하는 gradle 명령어

./gradlew flywayBaseline

image

version 이 0부터 시작하기 때문에 V1 스크립트부터 실행됩니다.

하지만 위에서 말했듯이 intellij 로 애플리케이션을 실행하면 Baseline이 따로 만들어지지 않고, V1부터 실행됩니다.

migration

이제 migration 을 해보겠습니다.

./gradlew flywayMigrate -i

-i 옵션은 history 가 어떻게 추가됐는지 추가 로그를 보여줍니다.

image image image

clean

이제 clean을 해보겠습니다.

script 를 통해 생성된 테이블과 history 가 전부 삭제됩니다.

cleanDisabled = false 

cleanDisabled default 값은 true이기 때문에 false 로 변경해줘야합니다.

true면 clean 명령어가 동작하지 않습니다.(flyway 에서 아예 막아두었습니다)

./gradlew flywayClean

image

제대로 삭제됨을 알 수 있습니다.

REFERENCES

gradle buildscript dependency 추가

gradle task

gradle task CLI

baseline migration

Clone this wiki locally