네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

- 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

 

Homepage - Flyway

Version control for your database. Robust schema evolution across all your environments. With ease, pleasure, and plain SQL.

flywaydb.org

https://sabarada.tistory.com/193

 

[flyway] flyway를 통해 DDL 형상관리를 하자 - Spring Boot (Java API) 편

안녕하세요. 오늘은 flyway를 이용하여 로컬 환경에서 DDL의 형상관리를 하는 방법을 알아보도록 하겠습니다. flyway flyway는 데이터베이스의 형상관리를 목적으로 하는 툴입니다. 데이터베이스의

sabarada.tistory.com

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !