이번 신규 프로젝트에 Flyway 를 적용하게되어 Flyway 관련 세미나를 진행하게 되었다. 그래서 세미나를 준비하며 정리했던 Flyway 개념에 대해 간단히 소개해보고자 한다.
그리고 프로젝트 적용기는 추후에 별도로 작성해보려한다.
Flyway 란?
- 데이터베이스 마이그레이션 툴 오픈소스
- Migrate, Clean, Info, Validate, Undo, Baseline, Repair 명령 기반으로 동작 가능
- 마이그레이션은 SQL 로 작성될수도 있고(PL/SQL, T-SQL도 가능) JAVA 로 작성도 가능
- 대부분의 데이터베이스 지원
- 마이그레이션을 위한 JAVA API, Maven, Gradle 플러그인, Spring Boot, Dropwizard 등 다양한 플러그인 제공
한마디로 데이터베이스 마이그레이션을 용이하게 도와주는 도구이다!
사용하는 이유
- 일반적인 배포 환경 : 로컬 → 통합환경 → 테스트 환경 → 운영 환경
소스 코드는 형상관리 툴등을 이용해 변경 이력을 관리할 수 있지만, 디비는..? 이력 관리 방법이 없다. 그러므로 Flyway 와 같은 도구를 사용해서 관리할 수 있다.(Ruby 는 소스 코드로 디비 스키마를 관리한다고 한다.)
- 변경된 스키마를 일일히 바꿔줘야 한다면 너무 번거롭고, 누락될 가능성도 있다.
동작 방식
Flyway 가 어떤 방식으로 데이터베이스를 마이그레이션하는지 알아보자.
-
먼저 flyway 가 database 가 비워져있다면, schema history table
(flyway가 데이터베이스의 상태를 추적하는 테이블) 을 생성한다. 이미 존재한다면 생성 하지 않는다.
-
database 의 상태를 추적하는 테이블 생성
위 그림에서 데이터베이스가 비어있으므로, 테이블을 생성한다.
- 그 다음 파일 시스템 또는 클래스패스를 스캔하여, sql 또는 Java 로 작성된 마이그레이션 파일을 버전 번호 순서대로 마이그레이션 한다.
Vesion1 실행 후, Version2 실행
- 마이그레이션이 적용된 후 schema history table 이 다음과 같이 업데이트 된다.
테이블에서 버전정보, 체크섬, 성공여부등을 확인할 수 있다.
- 초기 상태 완료 후, 버전정보를 저장하고 있기때문에, 다음 마이그레이션시에 이전 버전 또는 현재 버전과 같은 마이그레이션 파일은 무시한다. ex) 현재 버전이 v3라면, 파일명이 v3 또는 v3 보다 작은 숫자는 무시한다.
마이그레이션 파일명 규칙
flyway 는 마이그레이션 대상 파일명과 경로로 파일을 구분하고 스캔한다.
기본 경로인 /resources/db/migration
에 존재하는 파일들을 스캔한다. (경로는 설정으로 변경 가능)
- prefix : V 는 버전 마이그레이션, R은 반복마이그레이션, U는 취소 마이그레이션(유료)
- version : 버전 마이그레이션에만 사용되며 숫자와 점, 언더바 조합으로 구성 ex )V2, V2.1, V2_3
- separator : 설명부분을 구분하기 위한 구분자로 반드시 underscore 2개를 사용해야함 (__)
- description : schema_version 테이블에 저장시 설명 컬럼에 저장됨
- suffix : 확장자 기본은 .sql
Command
- flyway에서 제공하는 명령어를 살펴보자. 무료 버전 명령어만 살펴보자.(check, snapshot, undo 은 유료)
- Migrate : 스키마를 최신 버전으로 마이그레이션
- Info : 모든 마이그레이션 상세정보 출력
마이그레이션의 성공여부와 실행 시간등 상세 정보를 알 수 있다.
-
Clean : database 의 schema_version 테이블을 포함한 모든 테이블, 뷰, 프로시저등을 drop (운영환경에서 실행 금지)
-
Validate : database 에 적용된 마이그레이션 정보의 유효성 검증
데이터베이스에 적용된 마이그레이션과 로컬에서 사용하는 마이그레이션이 일치하는지 확인할 수 있으며, 저장된 체크섬을 확인하여 검증
-
Baseline : 특정 버전을 base로 사용하고 싶을 떄 사용
flyway 로 관리하기 전의 database 를 baseline 으로 설정할 때 사용
-
Repair : flyway_schema_table의 이슈를 수리하기 위해 사용
- 실패한 마이그레이션 항목 제거(DDL 트랜잭션을 지원하지 않는 database만 해당)
- 적용된 마이그레이션의 체크섬, 설명, 타입들을 사용 가능한 마이그레이션의 체크섬으로 재정렬
이와 같이 Flyway의 개념 및 동작과정과 기능들을 알아보았다. 확실히 간단하게 데이터베이스 마이그레이션을 할 수 있는 도구라고 생각된다.
하지만 생각보다 부분 유료 기능이 꽤나 많다... 유용하게 쓸 수 있는 Rollback 기능등은 유료다. 자세한 가격은 나와있지 않지만 유료버전은 꽤나 비싸다고 한다..
Liquibase는 롤백기능도 무료로 제공한다고 하니, flyway랑 비교해서 선택하면 될 것 같다..!
References
https://flywaydb.org/documentation/
https://www.popit.kr/나만-모르고-있던-flyway-db-마이그레이션-tool/