Skip to content

[BE] DB flyway

xrabcde edited this page Aug 5, 2021 · 8 revisions

Flyway란?

  • Flyway는 오픈소스 마이그레이션 툴이다.
  • 소스코드를 형상관리하는 Git과 같이 Flyway는 버전 관리 목적인 SCHEMA_VERSION 테이블을 통해 SQL 스크립트의 변화를 추적하면서 자동적으로 DB를 관리한다.

준비

  • 스프링 부트 build.gradle에서 의존성을 추가한다.
dependencies {
    implementation 'org.flywaydb:flyway-core:6.4.2'
}
  • application.properties에 아래 설정을 추가한다.
# flyway
spring.flyway.baseline-on-migrate=true
spring.flyway.baseline-version=0
spring.flyway.useMysqlMetadata=true
  • spring.flyway.baseline-on-migrate

    • 기본값 : false
    • false로 하려면 flyway_schema_history 테이블이 생성되어 있어야 함
    • true로 하면 flyway_schema_history 테이블이 없는 경우 생성함
  • spring.flyway.baseline-version

    • 기본값 : 1
    • 보통 버전파일이 V1__의 형태로 버전 1부터 시작하기 때문에 0으로 하는 것을 추천

flyway 적용 후 DB 변경방법

1. sql 파일 생성

  • resources/db/migration/prod 위치에 sql 파일을 생성한다.
  • 파일의 네이밍 규칙은 다음과 같다.
    naming
    • 왼쪽부터 prefix, version, description, suffix 순
    • prefix : default로 V는 버전 마이그레이션, R은 반복 마이그레이션 용 접두사 (반드시 V 혹은 R로 시작)
    • version : version은 버전 마이그레이션에서만 사용되며 숫자나 언더바 조합으로 사용
    • version과 description 사이의 __ (언더바 2개)는 반드시 있어야 함 (1개면 에러 발생)
    • description : schema_version 테이블에 저장시 설명으로 사용
    • suffix : 확장자, 기본은 .sql

2. 파일에 DB에 변경하고자 하는 내용의 SQL문을 작성한다.

  • 컬럼 추가
ALTER TABLE 테이블이름 ADD COLUMN 컬럼이름 varchar(20) NOT NULL;
  • 컬럼 추가 (디폴트값 지정)
ALTER TABLE 테이블이름 ADD COLUMN 컬럼이름 varchar(20) NOT NULL DEFAULT 기본값;
  • 컬럼 변경
ALTER TABLE 테이블이름 MODIFY COLUMN 컬럼이름 varchar(20) NOT NULL;
  • 컬럼 이름 변경
ALTER TABLE 테이블이름 CHANGE COLUMN 기존컬럼이름 변경할컬럼이름 varchar(20) NOT NULL;
  • 컬럼 삭제
ALTER TABLE 테이블이름 DROP COLUMN 컬럼이름;

3. 작성한 sql 문과 함께 기능에 대한 PR을 날린 뒤, dev에 머지가 되면 빌드시 DB에 변경사항이 반영된다.

❗️주의❗️

한번 작성 후 빌드가 된 sql문은 수정 혹은 삭제를 하면 안 됩니다. 변경이 필요하다면 버전을 올린 sql문을 추가로 작성해주셔야 합니다.

적용 때 발생한 이슈

초기 flyway sql 버젼 V1__init.sql 적용 불가 이슈

문제 상황

  • 다음과 같은 history 내역을 남기며 DB에는 V1__init.sql 내부 쿼리문들이 적용되지 않는 이슈가 있었음
mysql> select * from flyway_schema_history;
+----------------+---------+-----------------------+----------+-----------------------+----------+--------------+---------------------+----------------+---------+
| installed_rank | version | description           | type     | script                | checksum | installed_by | installed_on        | execution_time | success |
+----------------+---------+-----------------------+----------+-----------------------+----------+--------------+---------------------+----------------+---------+
|              1 | 1       | << Flyway Baseline >> | BASELINE | << Flyway Baseline >> |     NULL | root         | 2019-11-19 10:47:52 |              0 |       1 |
+----------------+---------+-----------------------+----------+-----------------------+----------+--------------+---------------------+----------------+---------+

원인

  • application-prod.properties 파일에 spring.flyway.baseline-version=0 설정이 누락되어 있었음
  • 위 baseline version의 default 설정은 1이기 때문에 flyway가 우리가 처음 작성한 V1 파일을 무시했던 것임

해결

  • 단순히 V2 파일을 추가로 만들어서 해결함
  • reference를 참고했음
Clone this wiki locally