데이터베이스도 git 과 같은 데이터베이스를 위한 형상관리 도구가 존재한다.
데이터베이스의 형상관리가 필요한 이유??
배포를 완료하고 서비스를 운영하던 도중 데이터베이스의 구조가 변경될 가능성이 존재한다. 하지만 운영 환경에서는 ddl-auto 와 옵션을 줄 수 없기 때문에 일일이 SQL 을 날려줘야 한다. 이렇게 데이터베이스의 유지보수를 하는 과정에 명령어 누락과 같은 실수로 인해 오류가 발생할 가능성이 커지기 때문에 데이터베이스도 형상관리가 필요하다.
자바에서 사용되는 형상관리 도구는 대표적으로 Flyway 와 Liquibase 가 있다. 둘 다 오픈소스이며 무료, 유료 버전이 존재한다.
Flyway vs Liquibase


- Flyway 는 주로 SQL, Liquibase 는 JSON, YAML, XML 등으로 데이터베이스의 변경사항을 정의할 수 있다.
- Liquibase 는 데이터베이스의 현재 상태에 대한 스냅샷을 찍을 수 있다.
- 두 도구 모두 자바에서 사용하기 좋지만 자바 코드를 사용하여 데이터베이스를 변경하는 것은 Flyway 에서만 지원된다.
- Flyway 는 유료 버전에서만 롤백을 지원하지만 Liquibase 는 무료버전에서도 롤백을 지원한다.
이 외에 Liquibase 가 기본적으로 제공해주는 기능들이 더 다양하다.
Flyway 를 선택한 이유
- Flyway 를 다루는 글들을 보다 쉽게 찾아볼 수 있었기 때문에 문제가 생겼을 경우 정보를 찾아보기 수월할 것 같다고 생각했다.
- Liquibase 에서 무료로 제공하는 기능들이 더 많다고는 하지만 이러한 기능들을 다 사용할 일이 없을 것 같았다.
Flyway 설정
build.gradle
implementation 'org.flywaydb:flyway-core'
application.yml
flyway: enabled: true baseline-on-migrate: true
- baseline-on-migrate: flyway_schema_history 가 이미 존재한다면 false 처음이라면 true 로 설정해준다.
- Flyway 를 적용할 때는 ddl-auto 옵션을 none 또는 validate 를 사용해야 한다.
- ddl-auto 옵션이 실행될 때 중복되서 테이블을 생성하면서
already exists ' ' table
과 같은 에러가 발생하기 때문이다.
Flyway 에서 SQL을 사용하기 위해서는 파일 규칙이 존재한다.
Migration Script Naming Rule

Script Locations


주의사항!!
기존에 있던 sql 파일들은 수정하거나 삭제해서는 안된다. 수정할 일이 생기면 새로운 버전의 sql 파일을 새로 만들어서 추가해야 한다. 만약 문제가 생기면 history 테이블을 수정해야 한다.