flyway를 사용한 DB 버전 관리

Belluga·2021년 9월 12일
2

Flyway

공식 도큐먼트
https://flywaydb.org/documentation/usage/gradle/

Flyway는 데이터베이스용 Git으로 DB 버전 관리 오픈소스 툴입니다.

Flyway의 필요성

대부분의 프로젝트는 local, dev(test), prod와 같이 다수의 환경을 가지고 있습니다.

project_root/sql/USER.sql

이전에는 위와 같이 스크립트 파일을 관리하고 일일이 로컬/개발/베타/운영 DBMS에서 각각 실행하였습니다.

그러나 이 경우에서는 개발 DB에서 변경한 Schema, Index등이 베타 DB에 누락되는 등의 실수가 발생할 수 있고 이는 장애로 이어질 수 있습니다.

이처럼 한 프로젝트의 변경된 DB 스키마 이력을 확인할 수 없다면 동일한 데이터베이스 환경을 구성하기 어렵습니다.

이 때 Flyway를 사용하여 실수를 방지할 수 있습니다.

Flyway updates a database from one version to the next using migrations.

Flyway는 한 버전으로부터 데이터베이스 마이그레이션을 수행합니다.
스키마 마이그레이션은 버전 정보를 확인 후 데이터베이스의 스키마를 최신으로 업데이트할 필요가 있을 때마다 데이터베이스를 업데이트하는 작업을 말합니다.

동작방식

최신보다 높은 버전으로 변경 사항 스크립트 파일이 작성되면 이를 반영하여 DB를 변경하게 됩니다.

이때 flyway_schema_history 테이블에 스키마 변경 이력이 쌓이게 됩니다.

Flyway 적용

build.gradle

implementation 'org.flywaydb:flyway-core:7.15.0'

main/application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3307/jagoga_db?serverTimezone=UTC&characterEncoding=UTF-8
    username: admin
    password: jagogaqwer1234
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        # show_sql: true
        format_sql: true

  flyway:
    baseline-version: 1

flyway에 db 접속정보를 입력하지 않아도spring.datasource에 설정된 접속 정보를 통해서 마이그레이션이 가능합니다.

resources/db/migration/V1__base.sql

create table users (
    user_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    name VARCHAR(30) NOT NULL,
    password VARCHAR(255) NOT NULL,
    phone VARCHAR(20) NOT NULL,
    role VARCHAR(10) NOT NULL,
    created_at DATETIME,
    modified_at DATETIME,
    UNIQUE INDEX ux_email (email)
) engine=InnoDB default character set = utf8;

스키마가 변경되는 일이 있을 경우 위 처럼 버전 명시한 sql 파일만 추가해주면 됩니다.

파일명 규칙
V + 버전 + __ + 설명.sql

파일 위치
src/main/resources/db/migration/V1__description.sql
flyway가 스크립트 파일을 인식하려면 위 경로에 존재해야 합니다.

test/application.yml

spring:
  datasource:
    url: jdbc:h2:mem:test;MODE=MYSQL;
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
        show_sql: true

테스트 코드 실행시 h2 DB를 사용하는데 스크립트 언어는 MySQL 문법으로 작성되어있어 테이블 drop & create시 문법 오류 발생합니다.
따라서 h2 DB 모드와 JPA Dialect를 MySQL로 설정하였습니다.

애플리케이션 실행시 flyway_schema_history 테이블에 스키마 변경 이력이 쌓이고 데이터베이스에 테이블이 추가된 것을 확인할 수 있습니다.

변경 사항

테이블 및 컬럼 등 변경사항이 생기는 경우 위와 같이 버전 업 sql 파일 생성 후 애플리케이션을 실행해주면 아래와 같이 flyway_schema_history 테이블에 변경 이력이 쌓이고 데이터베이스에 변경 내역이 반영됩니다.

References

https://github.com/iinow/flyway

https://sabarada.tistory.com/193

https://ecsimsw.tistory.com/entry/Flyway-DB-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%EA%B8%B0%EC%A1%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B0%80-%EC%9E%88%EB%8A%94-%EA%B2%BD%EC%9A%B0

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/

https://meetup.toast.com/posts/173

https://kimyhcj.tistory.com/358

https://www.baeldung.com/database-migrations-with-flyway

0개의 댓글