[BE] DB flyway - woowacourse-teams/2021-zzimkkong GitHub Wiki
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 파일을 생성한다.- 파일의 네이밍 규칙은 다음과 같다.
- 왼쪽부터 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문을 추가로 작성해주셔야 합니다.
적용 때 발생한 이슈
V1__init.sql
적용 불가 이슈
초기 flyway 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를 참고했음