ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring에서 flyway 사용하기
    Backend/Spring 2023. 5. 26. 01:41

    ◼ 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

    댓글

Designed by Tistory.