HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
팀 02 : 머쓱한녀석들
팀 02 : 머쓱한녀석들
/
🎏
BackEnd
/
🕋
기술문서
/
Flyway

Flyway

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
 

build.gradle 의존성 추가

  • flyway migration을 추가하지 않은 경우 밑을 gradle에 추가
 

여기서 발생한 문제

💡
mysql을 사용하려 했고 flyway는 mysql 8.0버전을 지원하지 않는다의 에러가 발생하였다.
 

해결

gradle에 밑에 있는 것을 추가하면서 해결하였다.
 

전체 build.gradle

 

aplication.yml

개발 준비

  1. member에 대한 기본 엔티티를 생성한다.
 
  1. src.resources.db.migration 폴더에 V1__init.sql 파일을 작성하여 초기 db를 세팅한다.
 
  1. 애플리케이션을 실행하여 member를 저장해본다
 

개발 준비 완료

  1. member가 저장이 되었다면 member와 flyway_schema_history 테이블이 생성이 된다.
notion image
  1. select * from flyway_schema_history 을 통해 script 부분에 V1__init.sql이 떠있다.
notion image
  1. 그러면 flyway 세팅과 개발 준비가 완료된 것이다.
 

변경 발생

member 엔티티에 나이(age)를 추가하였다.
 
  • 이렇게 바로 실행을 하게 되면 에러가 터지게 된다.
notion image
  • WHY? 엔티티에 변경이 일어났지만 flyway에게 변경 사항을 알려주지 않았기 때문이다
  • 해결
    • 변경 사항을 알려주기 위한 migration script 파일을 작성해준다.

migration script 작성

이전 정보 모두를 알려주는 것이 아니라 변경 부분만 알려준다.
 
실행을 하면 정상 작동을 하게 되고 flyway DB에 다음과 같이 history가 남는다
notion image
 

네이밍(naming)

  • v , u, R
notion image
  • 예
    • V1__init.sql
    • V1_0_1__add_column.sql
    • 등등
 
 

결론

  • 일단 보류하는 걸로
 

참고 영상

[10분 테코톡] 🐶 코기의 Flyway
🙋‍♀️ 우아한테크코스의 크루들이 진행하는 10분 테크토크입니다. 🙋‍♂️'10분 테코톡'이란 우아한테크코스 과정을 진행하며 크루(수강생)들이 동료들과 학습한 내용을 공유하고 이야기하는 시간입니다. 서로가 성장하기 위해 지식을 나누고 대화하며 생각해보는 시간으로 자기 주도적인...
[10분 테코톡] 🐶 코기의 Flyway
https://www.youtube.com/watch?v=pxDlj5jA9z4
[10분 테코톡] 🐶 코기의 Flyway
 
날짜
Jul 19, 2022
담당자
태그
flyway
완료여부
완료
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'
implementation 'org.flywaydb:flyway-core'
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' }
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' }
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
@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; } }
drop table if exists member; create table member ( id bigint auto_increment, name varchar(255), primary key (id) );
@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); } }
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Integer age; //추가 }
## V2__add_age_in_member.sql ## ALTER TABLE member ADD COLUMN age integer DEFAULT 0;