[Spring Boot] Flyway를 이용한 데이터 마이그레이션 / Spring DB Migration Tool flyway
- spring boot가 지원하는 DB migration tool은 Flyway와 Liquibase가 대표적
Flyway
- 오픈소스 마이그레이션 툴
- SQL 스크립트의 변화를 추적하면서 자동적으로 테이블의 스키마나 데이터의 변경 이력을 관리
스프링 부트에서 Flyway 사용
🌱 spring boot 2.6.0
🐥 mysql 5.7
🍿 jdk 8
- 의존성 추가
1) maven
# pom.xml
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
참고
- 공식문서에는 MySQL 5.7버전은 flyway 유료버전인 Flyway Teams을 사용해야 한다고 되어있다. version을 5.2.4로 정해주었더니 되어 version을 따로 기입하였다.
2) gradle
# build.gradle
dependencies {
implementation: 'org.flywaydb:flyway-core:5.2.4'
}
- 프로젝트 구조
resource 디렉터리에 db.migration 디렉터리를 생성해서 V0__init.sql 파일을 만든다.
- 경로를 변경하고 싶을 때는 application.yml 파일에서 아래와 같이 변경해주면 된다.
spring: flyway: location: [파일위치]
sql 파일을 생성할 때 파일 이름을 정해진 기준에 따라 생성해야 한다.
=> File Naming
- prefix: default로 V 는 버전 마이그레이션, R은 반복 마이그레이션용 접두사이다. 반드시 V또는 R로 시작해야만 flyway가 인식.
- version: version은 버전 마이레이션에서만 사용되며 숫자와 Dots(점)이나 underscore(언더바) 조합으로 구성한다. (반복 마이그레이션에서 (version을 명시하면 filename제약 위반으로 에러 발생)
- separator: 설명부분을 구분하기 위한 구분자이며 반드시 undersocre(언더바)를 2개( __ ) 써야한다.
- description: 이 부분은 schema_version테이블에 저장시 설명으로 사용된다.
- suffix: 확장자 기본은 .sql
- application.yml 파일 내용 추가
spring: datasource: url: jdbc:mysql://localhost:[port]/[schema명]?characterEncoding=UTF-8 username: [username] password: [password] driver-class-name: com.mysql.jdbc.Driver flyway: enabled: true baseline-on-migrate: true
- spring.flyway.baseline-on-migrate
- 기본값: false
- false: flyway_schema_history 테이블이 있는 경우
- true: flyway_schema_history 테이블이 없는 경우 생성
이외에도 설정 정보들을 변경할 수 있다. 참고
- Spring boot Run
spring boot를 실행하면 DB schema에 flyway_schema_history 테이블이 생성되면서 migration이 자동으로 실행됩니다.
아래는 관련 로그입니다. migration이 잘 실행되었는지 확인할 수 있습니다.
INFO 49320 --- [ restartedMain] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://localhost:3306/[schema명] (MySQL 5.7) INFO 49320 --- [ restartedMain] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.139s) INFO 49320 --- [ restartedMain] o.f.core.internal.command.DbMigrate : Current version of schema `[schema명]`: 0 INFO 49320 --- [ restartedMain] o.f.core.internal.command.DbMigrate : Schema `[schema명]` is up to date. No migration necessary.
- flyway_schema_history 테이블
flyway_scheme_history 테이블은 flyway에서 형상관리를 위하여 자동으로 생성되는 테이블입니다.
- version: 파일의 V 뒤에 붙어있던 숫자로 낮은 순서부터 실행되며 실행 순서대로 테이블에 쌓이는 구조를 가집니다.
- checksum: 파일의 내용을 hashing한 것입니다. 만약 파일의 내용이 달라지면 이 체크섬이 달라지게 됩니다. 한번 체크섬을 만들어 둔 후 파일을 수정한다면 그렇게 되면 누군가에 의해서 형상관리에 문제가 생겼다고 판단하기 때문에 flyway는 에러처리를 하게됩니다. 이럴 경우 해당 파일에 대한 체크섬을 repair한 후 success를 0으로 돌리는 등의 작업이 필요합니다.
- success: 파일 실행에 성공했는지 여부를 나타내는 값입니다. 이 값에 따라서 flyway에서 해당 파일의 내용을 실행할지 말지 결정합니다.
참고
https://flywaydb.org/documentation
https://sabarada.tistory.com/193
'web > Spring' 카테고리의 다른 글
[Spring] @RequestBody, @RequestParam, @ModelAttribute의 차이 (0) | 2022.01.12 |
---|---|
[Spring JPA] Spring JPA에서 Cubrid(DBMS) 연결하는 법 (0) | 2022.01.04 |
[Spring] RestTemplate / spring 에서 http 통신하는 법 / API 호출 (2) | 2021.12.01 |
[Spring Mybatis] DB 조회, 수정, 삽입, 삭제 기능 구현 (0) | 2021.11.26 |
[JSP] formatNumber, formatDate 확장 태그 (2) | 2021.11.25 |
댓글 개