💡 Flyway 란?
Flyway
: 데이터베이스 형상 관리를 위한 오픈 소스 데이터베이스 마이그레이션 툴이다.
* 형상 관리(Software Configuration Management) - 소프트웨어의 변경 사항을 체계적으로 추적하고 통제하는 것
* 데이터베이스 마이그레이션 툴 - 데이터베이스의 변경 사항을 추적하고 업데이트나 롤백을 쉽게할 수 있도록 하는 도구
소스 코드의 이력을 Git으로 관리하듯, 데이터베이스 이력을 Flyway로 관리한다고 생각하면 이해하기 쉽다 !
✔️ 데이터베이스 형상 관리의 장점
- 데이터베이스 스키마(Schema) 변경 이력이 남는다.
- 데이터베이스에서 문제가 발생했을 때, 데이터베이스를 수정한 변경 이력이 남아있으면 문제의 원인을 파악할 수 있어서 문제 해결에 도움이 된다.
- 데이터베이스 변경 작업을 안전하게 할 수 있다.
- 코드를 통해 스키마를 변경함으로써 변경 중에 발생할 수 있는 작업자의 실수가 줄어들고, 배포 시에 스키마를 변경하는 자동화도 가능하다.
✔️ 데이터베이스 마이그레이션의 필요성
프로젝트를 진행하면 위 그림처럼 데이터베이스가 여러 환경(Ex. 로컬/테스트/운영 환경)에 존재하게 된다.
각자의 로컬 환경에서 개발을 하게 되면 엔티티의 구조가 변경되고, 이로 인해 데이터베이스 스키마도 변경되어야 한다.
예를 들어, JPA를 사용하는 환경에서 엔티티 구조가 변경되면 이 변경 사항을 다른 배포 환경에 적용해야 한다.
개발이나 테스트 단계에서는 Hibernate에서 제공하는 ddl-auto 설정을 통해 반영할 수 있겠지만, 실제 운영 환경에서는 불가능하다.
운영 환경에 적용하기 위해서는 ALTER TABLE 과 같은 DDL을 사용해야 한다.
ALTER TABLE student ADD COLUMN number VARCHAR(20) NOT NULL;
하지만, 위의 방법은 실수가 발생하기 쉽고, 형상 관리가 어렵다는 문제점이 존재한다.
이러한 문제점을 해결하기 위해 데이터베이스 마이그레이션 툴인 Flyway를 사용하는 것이다.
💡 Flyway 동작 방식
1. Flyway가 schema_version 테이블(Flyway가 데이터베이스의 상태를 추적하는 테이블)을 찾고, 존재하지 않다면 테이블을 생성한다.
2. 마이그레이션을 위해 SQL이나 Java로 작성된 마이그레이션 스크립트를 찾아 버전 순서대로 마이그레이션을 진행한다.
3. 마이그레이션이 적용된 후, schema_version 테이블이 업데이트 된다.
💡 Flyway 마이그레이션 파일명 규칙
Flyway는 마이그레이션 대상 파일명과 경로로 파일을 구분하고 스캔한다.
* 기본 경로 : /resources/db/migration (설정으로 변경 가능)
* Prefix : V(버전 마이그레이션), U(취소 마이그레이션), R(반복 마이그레이션)
* Version : 버전 마이그레이션에만 사용되며, 숫자와 점, 언더바 조합으로 구성된다.
* Separator : Description을 구분하기 위한 구분자로, 반드시 underscore를 2개 사용해야 한다. (__)
* Description : 해당 파일을 설명한다.
* Suffix : 확장자로, .sql 이 기본 값이다.
✔️ Versioned Migrations
마이그레이션 스크립트의 최신 버전과 현재 데이터베이스의 스키마 버전을 비교하면서 마이그레이션 스크립트를 순차적으로 실행한다. 최신 버전의 숫자보다 작은 숫자로 마이그레이션 스크립트를 추가하면, 해당 마이그레이션 스크립트는 무시된다.
즉, 마이그레이션 스크립트를 추가할 때, 항상 최신 버전보다 큰 숫자로 버전을 설정해야 한다.
✔️ Undo Migrations
Flyway의 유료 버전에서만 사용이 가능하며, 상황에 따라 Undo Migrations 기능의 사용이 위험할 수 있기 때문에 주의해서 사용해야 한다.
✔️ Repeatable Migrations
모든 마이그레이션 스크립트가 실행된 이후에 실행되는 스크립트로, Repeatable Migrations 끼리는 description 순서대로 실행된다. 한 번 실행이 되고, 이후에 스크립트가 변경되어 체크섬이 변경되면 실행된다.
💡 Flyway 예제
본 포스팅에서는 SpringBoot, Docker, MySQL을 사용한 예제를 작성한다.
1. Flyway 실습 환경 구축 (Docker 사용)
1.1 docker-compose.yml 파일 생성
version: '3.6'
services:
mysql:
container_name: flyway-mysql
image: mysql:8.0
platform: linux/amd64
volumes:
- ./my.cnf:/etc/mysql/my.cnf
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=flyway
- MYSQL_USER=flywaytest
- MYSQL_PASSWORD=flywaytest
ports:
- 3306:3306
command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
MySQL 컨테이너를 띄우기 위해 docker-compose.yml 파일을 생성 후, 위와 같이 작성한다.
1-2. build.gradle 의존성 추가
implementation 'org.flywaydb:flyway-mysql'
2. DataSource 설정
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/flyway?useSSL=false&allowPublicKeyRetrieval=true
username: flywaytest
password: flywaytest
Spring Boot는 DataSource 설정으로 Flyway를 자동 연결하기 때문에 application.yml 에 DataSource 관련 설정을 한다.
3. Flyway 활성화
spring:
datasource:
...
flyway:
enabled: true
application.yml 에 Flyway 활성화 설정을 한다.
4. 마이그레이션 스크립트 작성

CREATE TABLE member (
studentId BIGINT AUTO_INCREMENT,
studentName VARCHAR(10),
studentEmail VARCHAR(50),
PRIMARY KEY (studentId)
);
파일명에 언더스코어(__) 가 2개 사용됨을 주의하자 !!
5. 프로젝트 실행하기
프로젝트를 실행해보면 Flyway가
데이터베이스의 상태를 추적하는 테이블인 flyway_schema_history와 member 테이블이 생성된 것을 확인할 수 있다.
출처
긴 글 읽어주셔서 감사합니다 🍀
잘못 작성된 내용은 피드백 주시면 반영하겠습니다 😎
'Database' 카테고리의 다른 글
[DB] RDBMS와 NoSQL 사용하기 (0) | 2024.02.01 |
---|