Flyway 버전 관리 목적실행환경Dependencybuild.gradle 의존성 추가여기서 발생한 문제해결전체 build.gradleaplication.yml개발 준비개발 준비 완료변경 발생migration script 작성네이밍(naming)결론 참고 영상
Flyway is an open-source database-migration tool
즉, 데이터베이스의 형성관리를 목적으로 하는 툴이다.
Flyway 버전 관리 목적
SCHEMA_VERSION 테이블을 통해 SQL 스크립트의 변화를 추적하면서 자동적으로 관리한다.
실행환경
- java 17
- gradle
Dependency
- spring web
- spring data jpa
- mysql connector
- flyway migration
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'mysql:mysql-connector-java' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.flywaydb:flyway-core'
build.gradle 의존성 추가
- flyway migration을 추가하지 않은 경우 밑을 gradle에 추가
implementation 'org.flywaydb:flyway-core'
여기서 발생한 문제
mysql을 사용하려 했고 flyway는 mysql 8.0버전을 지원하지 않는다의 에러가 발생하였다.
해결
gradle에 밑에 있는 것을 추가하면서 해결하였다.
plugins { id "org.flywaydb.flyway" version "7.2.0" } .... dependencies { compileOnly "org.flywaydb:flyway-mysql" implementation 'org.flywaydb:flyway-core' } ....제일 하단 flyway { url = 'jdbc:mysql://localhost:3306/flyway?useSSL=false&serverTimezone=UTC&characterEncoding=utf8' user = 'root' password = 'a123456789' }
전체 build.gradle
plugins { id 'org.springframework.boot' version '2.7.1' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' //flyway id "org.flywaydb.flyway" version "7.2.0" } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'mysql:mysql-connector-java' //flyway compileOnly "org.flywaydb:flyway-mysql" implementation 'org.flywaydb:flyway-core' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } //flyway flyway { url = 'jdbc:mysql://localhost:3306/flyway?useSSL=false&serverTimezone=UTC&characterEncoding=utf8' user = 'root' password = 'a123456789' }
aplication.yml
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/flyway username: root password: a123456789 jpa: database: mysql database-platform: org.hibernate.dialect.MySQL8Dialect show-sql: true hibernate: ddl-auto: validate properties: hibernate: format_sql: true flyway: enabled: true baseline-on-migrate: true
개발 준비
- member에 대한 기본 엔티티를 생성한다.
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; public Member() { } public Member(Long id, String name) { this.id = id; this.name = name; } }
- src.resources.db.migration 폴더에 V1__init.sql 파일을 작성하여 초기 db를 세팅한다.
drop table if exists member; create table member ( id bigint auto_increment, name varchar(255), primary key (id) );
- 애플리케이션을 실행하여 member를 저장해본다
@SpringBootApplication public class FlywaySturdyApplication { private final EntityManager em; public FlywaySturdyApplication(EntityManager em) { this.em = em; } public static void main(String[] args) { SpringApplication app = new SpringApplication(FlywaySturdyApplication.class); app.setWebApplicationType(WebApplicationType.NONE); ConfigurableApplicationContext run = app.run(args); FlywaySturdyApplication flyway = (FlywaySturdyApplication)run.getBean("flywaySturdyApplication"); Member member = new Member(null, "name"); flyway.save(member); } @Transactional public void save(Member member) { em.persist(member); } }
개발 준비 완료
- member가 저장이 되었다면 member와 flyway_schema_history 테이블이 생성이 된다.

- select * from flyway_schema_history 을 통해 script 부분에 V1__init.sql이 떠있다.

- 그러면 flyway 세팅과 개발 준비가 완료된 것이다.
변경 발생
member 엔티티에 나이(age)를 추가하였다.
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Integer age; //추가 }
- 이렇게 바로 실행을 하게 되면 에러가 터지게 된다.

- WHY? 엔티티에 변경이 일어났지만 flyway에게 변경 사항을 알려주지 않았기 때문이다
- 해결
변경 사항을 알려주기 위한 migration script 파일을 작성해준다.
migration script 작성
이전 정보 모두를 알려주는 것이 아니라 변경 부분만 알려준다.
## V2__add_age_in_member.sql ## ALTER TABLE member ADD COLUMN age integer DEFAULT 0;
실행을 하면 정상 작동을 하게 되고 flyway DB에 다음과 같이 history가 남는다

네이밍(naming)
- v , u, R

- 예
- V1__init.sql
- V1_0_1__add_column.sql
- 등등
결론
일단 보류하는 걸로