HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
[팀 BackFro💯] ArtZip: 세상 모든 전시회를 한 번에
[팀 BackFro💯] ArtZip: 세상 모든 전시회를 한 번에
/
☠️
백엔드 기술 문서
/
💽
Flyway (DB migration 툴) 적용하기
💽

Flyway (DB migration 툴) 적용하기

논의사항왜 사용할까?간단 설명사용시 주의사항 (Rules)적용하기의존성 및 properties 설정DB schema 변경(또는 entity 변경) 후 마이그레이션 파일 작성법merge 후에 다른 팀원이 작성한 버전과 같은 버전의 마이그레이션 파일을 작성한 경우활용하기1. local에서 테스트할 때 더미 데이터 넣어주기(작성중)2. 첫번째 버전 migration 파일 작성하기참고자료
💡
토글로 접어두지 않은 부분은 필수적으로 읽고 적용해주셔야 합니다‼️
💡
공식문서에서는 Java 12까지 Gradle 6.x까지 지원한다고 쓰여있지만, 여러 적용 사례를 봤을 때 최신버전에서도 대체로 잘 작동하는 편인 것 같습니다

논의사항

  1. 어떤 환경(local, dev)에서 사용할 것인지
  1. CI할 때 data container를 만드는 방법도 있는데 다들 어떻게 생각하지는지요

왜 사용할까?

  • 배포 후 운영 환경에서는 DB shema에 변경이 생기면 직접 DB 서버에 접속해서 하나하나 수정해주어야 함 → 에러 발생 가능성 커짐
  • DB 변경내역 확인 가능

간단 설명

용어 정리

  • Migration: DB에 대한 모든 변경 사항
    • 작성 가능 언어: sql, java, 스크립트 언어
    • 종류
      • Versioned Migration
        • version, description, checksum이 있음
        • 순서대로 정확히 한 번 적용됨
        • 일반적인 마이그레이션
        • 사용되는 경우
          • Creating/altering/dropping tables/indexes/foreign keys/enums/UDTs/…
          • Reference data updates
          • User data corrections
      • Undo Migration
        • Versioned migration의 반대
        • versioned migration과 같은 버전의 마이그레이션을 undo하는 효과
      • Repeatable Migration
        • description, checksum이 있음
        • checksum이 변경될 때마다 (재)적용됨
        • 사용되는 경우
          • (Re-)creating views/procedures/functions/packages/…
          • Bulk reference data reinserts

sql로 작성된 버전 마이그레이션 동작 예시 (참고링크)

  1. 2개의 마이그레이션(db schema 변경 sql문 작성된 파일)을 갖고 있고 DB는 비워져 있는 상태
  1. 대상 DB에 SCHEMA_VERSION(flyway가 변경이력을 관리하는 meta table) table이 존재하는지 확인하고 없으면 새로 생성됨
  1. flyway가 지정된 classpath에서 마이그레이션 파일을 탐색하여 버전 순서대로 실행
  1. 마이그레이션 실행 후에 SCHEMA_VERSION table에 실행이력을 저장

사용시 주의사항 (Rules)

  • SQL-based migration으로 작성 (마이그레이션은 sql, java, 스크립트 언어로 작성될 수 있음)
  • File Naming
    • notion image
    • prefix (V)
      • V: 버전 마이그레이션
      • R: 반복 마이그레이션
      • ❗️V나 R로 시작해야 flyway가 인식 가능
    • version (2)
      • 버전 마이그레이션에서만 사용
      • 숫자, 점, 언더바 조합으로 사용
      • ❗️반복 마이그레이션에서 version을 명시하면 파일명 제약 위반으로 에러 발생
    • separator (__)
      • description 부분을 구분하기 위한 구분자
      • ❗️언더바 2개 써야함
    • description (Add_new_table)
      • schema_version 테이블에 저장시 설명으로 사용됨
      • 언더바, 스페이스로 단어 사이 구분
    • suffix (.sql)
      • 확장자
  • migration file 위치
    • : application.yml에서 spring.flyway.locations의 옵션으로 위치 설정 가능
    • default, classpath: prefix가 붙은 location → Java classpath (src/main/resources/db/migration)
    • filesystem: prefix가 붙은 location → 파일 시스템에서 찾음 (예시: filesystem:/my-project/my-other-folder )
    • s3: prefix가 붙은 location → AWS S3 버킷에서 찾음
      • AWS SDK v2사용해야 함. dependencies도 추가해야 함
      • (참고) 필요하다면 나중에 추가해볼 예정
    • gcs: prefix가 붙은 location → GCS 버킷에서 찾음

적용하기

의존성 및 properties 설정

  • build.gradle
implementation 'org.flywaydb:flyway-core' implementation 'org.flywaydb:flyway-mysql'
  • application.yml
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test_db username: root password: root1234! flyway: enabled: true baseline-on-migrate: true locations: classpath:db/migration baseline-version: 0 # jpa ddl-auto 옵션은 validate로 설정(create, update 말고)

DB schema 변경(또는 entity 변경) 후 마이그레이션 파일 작성법

  1. 위 파일명 규칙에 맞게 마이그레이션 파일을 생성
    1. 생성 위치: src/main/resources/db/migration
  1. 마이그레이션 파일에 sql로 변경사항 작성
    1. 💡
      하나의 파일에 1개의 DDL만!! flyway는 checksum을 파일 단위로 관리하며 파일에 문제가 생겼을 때 이 이후의 로직을 실행하지 않기 때문.

merge 후에 다른 팀원이 작성한 버전과 같은 버전의 마이그레이션 파일을 작성한 경우

  • 버전을 겹치지 않게 변경

활용하기

1. local에서 테스트할 때 더미 데이터 넣어주기(작성중)

  1. src/main/resources/db/seed에 R로 시작하는 Repeatable migration 파일 작성 (이때 파일명 규칙 참고해서 작성!!)
  1. 1)에서 만든 repeatable migration 파일에 sql INSERT문을 사용하여 데이터 삽입하는 스크립트 작성
  1. 1)에서 만든 repeatable migration 파일명과 동일하게 .conf를 붙인 설정파일 생성
 

2. 첫번째 버전 migration 파일 작성하기

  • jpa auto-ddl 이용해서 일단 table을 다 만들고
      1. 그 이후에 추가되는 부분부터 migration 파일 작성하기
      1. 자동 생성된 ddl 복붙해서 V1 migration 파일 작성하기
      이 둘 중에 하나의 방식으로 진행하면 될 것 같음

참고자료

Flyway by Redgate * Database Migrations Made Easy.
With Flyway all changes to the database are called migrations. Migrations can be either versioned or repeatable. Versioned migrations come in 2 forms: regular and undo. Versioned migrations have a version, a description and a checksum. The version must be unique. The description is purely informative for you to be able to remember what each migration does.
Flyway by Redgate * Database Migrations Made Easy.
https://flywaydb.org/documentation/concepts/migrations#java-based-migrations
Flyway by Redgate * Database Migrations Made Easy.
Flyway 로 같이 일 하기
그러나 현실에서 Flyway 를 별도 규칙 없이 적용하게 되면 마이그레이션 파일들의 순서가 꼬이거나, 같은 작업을 수행하거나 하여서 정상적으로 마이그레이션이 되지 않는 현실과 맞닿게 됩니다. Flyway 반영은 다양한 시점(ex. 빌드나 배포시점에 jenkins 로 gradle 에서 수행하기, 어플리케이션 구동시 수행하기, cli 를 이용한 수동 적용하기...
Flyway 로 같이 일 하기
https://medium.com/@slothink/flyway-%EB%A1%9C-%EA%B0%99%EC%9D%B4-%EC%9D%BC-%ED%95%98%EA%B8%B0-30a33f123b4e
www.popit.kr
https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-flyway-db-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-tool