본문 바로가기

Backend/Spring

spring에서 flyway 사용하기

◼ flyway는 데이터 베이스의 현상관리를 목적으로 하는 툴이다.

◼ 데이터 베이스의 DDL 이력을 쌓아서 DDL이 어떻게 변화되었는지 관리하고, 사용하는 데이터 베이스의 스키마 버전을 관리할 수 있다.

 

💬 스키마의 이력관리와 프로덕션 코드 작성 시, SQL 문도 함께 작성하여 배포 시 자동으로 DB 스키마 수정이 가능하도록 하기 위해 사용한다.


사용하기

✔ build.gradle.kts 파일에 다음과 같은 의존성을 추가한다.

implementation("org.flywaydb:flyway-core")
implementation("org.flywaydb:flyway-mysql")

 

💥 MariaDB 10.6 이상 버전을 사용하는데 implementation("org.flywaydb:flyway-mysql") 의존성을 추가하지 않으면 다음과 같은 에러가 발생한다.

 

✔ application.yml 파일에 다음을 추가한다.

spring:
  flyway:
    enabled: true
    baseline-on-migrate: true

◼ 원하는 profile에 해당 옵션을 설정하면 datesource에 등록된 데이터 베이스에 flyway가 적용된다.

◼ 보통 local, dev, prod 환경에 사용하고 test 환경에서는 enabled: false로 설정한다.

 

✔ resources/db/migration에 .sql 파일 추가

◼ resources/db/migration 경로에 마이그레이션 파일을 추가한다.

◼ 파일 이름은 다음과 같은 형식을 따른다.

Prefix - (V, U, R)
   V: Verion, U: undo, R: Repeatable
Version - 버전 정보(정수, 소수, 날짜 등...) 
Seperator - __ (underscore 2개)
Description - 설명

 

✔ spring boot 애플리케이션 실행

◼ spring boot 애플리케이션을 실행하면 flyway가 적용된다.

◼ gradle build 시 flyway를 실행하고 싶다면, plugin을 사용해서 gradle에 설정하면 된다.

 

✔ flyway_schema_history 테이블

◼ flyway에서 형상 관리를 위하여 자동으로 만드는 테이블이다.

◼ 위 구조에서 중요한 것은 version, checksum, success 필드이다.

version: .sql 파일 V 뒤에 붙어 있는 숫자로, 낮은 숫자부터 실행되며 해당 숫자가 기록된다.

checksum: 파일의 내용을 hashing한 값으로 파일의 내용이 달라지면 체크섬 값이 달라져 에러가 발생한다.

success: 파일의 실행이 성공했는지를 나타내는 값이다. 

 

JPA의 ddl-auto: update를 사용하는 것이 아닌 flyway를 사용하는 이유

◼ 의도치 않은 데이터의 변경을 막기 위해

◼ ddl-auto: update를 사용하면 엔티티의 변화에 따라 DB 스키마가 바로 반영되기 때문에, 의도치 않은 데이터 손실이 발생할 수 있다.

◼ flyway를 사용하여 변경 이력을 직접 작성하고 검증하는 과정을 통해 위 상황을 방지할 수 있다.

'Backend > Spring' 카테고리의 다른 글

Kotlin에서 Rest Docs 문서화 코드 개선하기  (0) 2023.05.29
Kotest를 통한 DCI 패턴 적용  (0) 2023.05.27
[Spring] checkstyle 적용하기  (0) 2023.05.03
DDD(Domain Driven Design)란?  (1) 2023.04.03
[Spring] Rest-Docs 연결  (0) 2023.01.13