SpotEditor ‐ Flyway 도입 - dnwls16071/Backend_Summary GitHub Wiki

Flyway란?

image

  • Flyway는 데이터베이스 형상관리를 목적으로 하는 툴입니다.
  • 소스 코드를 git을 이용해서 관리하듯이 데이터베이스 소스코드(DDL)를 Flyway로 관리합니다.
  • Flyway는 버전 관리 목적인 flyway_schema_history라는 테이블을 통해 SQL 스크립트의 변화를 추적하면서 자동적으로 관리합니다.

적용 방법

  • 다음과 같은 의존성을 추가해줍니다.
implementation 'org.flywaydb:flyway-core'
implementation 'org.flywaydb:flyway-mysql'
  • 의존성을 추가한 다음 아래와 같이 application.yml을 작성합니다.
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spoteditor
    username: root
    password: spoteditor

  flyway:
    enabled: true
    baseline-on-migrate: true 
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spoteditor
    user: root
    password: spoteditor

  jpa:
    hibernate:
      ddl-auto: validate
    generate-ddl: true
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
        connection:
          characterEncoding: UTF-8
    defer-datasource-initialization: false
  • flyway 설정만 살펴본다면...
    • enabled
      • flyway를 사용하겠다는 설정으로 기본값은 true입니다.
    • baseline-on-migrate
      • flyway는 버전 정보를 flyway_schema_history라는 테이블에서 관리합니다. 이 테이블을 자동으로 생성해주는 옵션을 말합니다.
      • 기본값은 false로 히스토리 테이블이 이미 존재할 때 사용합니다.

Flyway 작성하기

  • 패키지 구조는 위와 같이 작성을 하면 됩니다.
  • 이 때, 반드시 resources/db/migration 하위에 작성을 해야 합니다.
  • 경로를 변경하고 싶다면 별도의 설정을 해주면 되지만 저희 프로젝트에서는 굳이 설정을 변경할 필요가 없어 그대로 사용했습니다.

SQL 네이밍 규칙

image

  • Prefix
    • V, U, R 중 하나를 선택합니다.
    • V(Version) : 버전 마이그레이션
    • U(Undo) : 실행 취소
    • R(Repeatable) : 반복 가능한 마이그레이션
  • Separator : 구분자로 _가 2개인 것을 주의해야 합니다.
  • Description : 실질적 파일 명으로 밑줄이나 공백으로 단어를 구분합니다.
  • Suffix : 접미사로 보통 .sql을 사용합니다.
  • 스프링 부트를 실행시키게 되면 flyway_schema_history 테이블에 위와 같이 표시가 됩니다. flyway로 등록된 순간을 기준으로 flyway가 DB 버전 관리를 하게 되므로 해당 스크립트를 수정하거나 삭제하면 안됩니다.
  • 만약 새로운 필드를 추가하게 되면 Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: 오류를 마주하게 됩니다.
  • 이 경우 V2로 새롭게 버전 정보를 만들어주고 변경 정보와 추가로 생성되는 테이블 구문(DDL or DML)을 작성해주면 됩니다.

기존 데이터나 Migration 이력이 존재하는 경우

  • 저희 프로젝트에서는 국토교통부에서 제공하는 도로명 주소 DB를 그대로 구축해 주소 DB를 자체적으로 구축한 상황입니다.
  • 앞선 적용하기에서는 초기에 DB에 아무런 데이터가 없을 때 사용한 경우이고 주소 데이터가 들어간 상황이라면 얘기가 달라집니다.
  • 기존 데이터나 Migration 이력이 존재한다면 다르게 작성을 해야 합니다.
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spoteditor
    username: root
    password: spoteditor

  flyway:
    enabled: true
    baseline-on-migrate: false # 여기 주의!
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spoteditor
    user: root
    password: spoteditor

  jpa:
    hibernate:
      ddl-auto: validate
    generate-ddl: true
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
        connection:
          characterEncoding: UTF-8
    defer-datasource-initialization: false