-
728x90
flyway
db 마이그레이션 툴
사용이유
매번 db에 직접 들어가서 테이블을 수정하기에는 번거로우며, 실수하기 쉬움 또한 개발환경이 다를 경우 실수하기 쉬움
동작방식
데이터 베이스가 없는 경우, flyaway가 만들어 준다.
데이터베이스가 있는 경우, flyway는 버전별로 파악하여 히스토리를 체크하여 마이그레이션 해준다.
버전은 오름차순이며, 새로운 버전에서 테이블을 삭제시 삭제가 적용되고, 추가시 추가가 적용된다.
하지만 만약 버전4를 작성 후, 버전 2.2를 작성하면 버전 2.2는 적용이 안된다.
또한 각각의 버전은 유니크 하여 같은 버전이 있으면 안된다.
위에서 마이그레이션한 db에 대한 정보가 flyway_schema_history에 작성된다.
이름규칙
앞에 Prefix에는 V, U, R이 들어갈 수 있고 각각 버전, Undo, Repeatable을 의미한다.
뒤에 __는 반드시 _ 2개가 들어가야 된다.
그 후 변경사항에 대한 설명을 적어줘야 된다.
주로 쓰는 마이그레이션은 Version Migrations로 prefix로 V를 사용한다.
각 버전이 바뀔때마다 작성하는 것으로 버전은 유니크 해야하며, 오름차순이어야 한다.
Repeatable migration은 버전 없이, 한번만 실행되는 대신 변경 사항이 생길때마다 재적용 된다.
기존 DB가 있을 경우 이를 적용하기 위해 빈 스크립트 파일을 생성시키면 flyway가 적용이 된다.
스프링부트 적용
implementation 'org.flywaydb:flyway-core'
설정
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/[db명] username: [id] password: [password] jpa: hibernate: ddl-auto: validate database-platform: org.hibernate.dialect.MySQL8Dialect show-sql: true database: mysql flyway: locations: "classpath:db/migration" enabled: true baseline-on-migrate: true url: jdbc:mysql://localhost:3306/[db명] user: [id] password: [password] logging: level: org.hibernate.SQL: debug org.hibernate.type: trace
예제
import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; private int age; }
위와 같은 Member.java 파일이 있고,
drop table if exists member; create table member( id bigint not null, name varchar(255), age int )
v1의 flyway파일이 존재한다.
실행 시키면 다음과 같은 history가 생성된다.
그 이후 entity를 수정하면 에러가 발생하고, 이에 맞춰 flyway도 마이그레이션 해줘야한다.
import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; private int age; private String address; }
V2__addAddress.sql
ALTER TABLE member ADD address varchar(255);
Repair설정
migrate가 되지 않은 오류가 생길 경우, Db에 직접 들어가 history를 삭제하여 해결할 수 있지만,
최대한 db를 건들이지 않기 위해 flyway를 사용하는 만큼 config설정을 통해 해결할 수 있다.import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SpringConfiguration { @Bean public FlywayMigrationStrategy flywayMigrationStrategy(){ return flyway -> { flyway.repair(); flyway.migrate(); }; } }
TestDB 설정
test 밑에 resource 폴더 생성 후 아래 yml파일을 통해 test db와 application db를 나누어 설정할 수 있다.
spring: datasource: url: jdbc:h2:~/test username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: validate database-platform: org.hibernate.dialect.MySQL8Dialect show-sql: true database: mysql flyway: locations: "classpath:db/migration/{vendor}" enabled: true baseline-on-migrate: true url: jdbc:h2:~/test user: sa password: logging: level: org.hibernate.SQL: debug org.hibernate.type: trace
728x90반응형'공부 > 자바' 카테고리의 다른 글
Java Records (0) 2023.07.31 자바 instanceof (0) 2023.07.29 외부함수와 메모리 API (0) 2023.07.29 switch를 위한 패턴 매칭 (0) 2023.07.29 17 preview version 안되는 오류 (0) 2023.07.29