글에서 사용한 코드가 있는 깃헙
Flyway는 데이터베이스 마이그레이션 도구이다.
개념적으로 서로 다른 DB끼리의 마이그레이션을 하는 거라기 보단 하나의 개념적인 DB를 점진적으로 발전시켜나가고, 관리할 수 있게 도와준다는 의미에서의 마이그레이션 도구로 보면 된다.
dependencies {
...
implementation 'org.flywaydb:flyway-core'
implementation 'org.flywaydb:flyway-mysql'
...
}
Gradle을 빌드툴로써 사용하는 경우, 위와 같이 라이브러리를 명시해주면 Flyway를 사용할 수 있게 된다.
MySQL을 데이터베이스로 사용하고 있다면, org.flywaydb:flyway-mysql
로 같이 명시해준다.
spring.flyway.enabled=true
spring.flyway.baseline-on-migrate=true
# 이미 Spring datasource 설정이 존재한다면, 아래의 설정은 하지 않아도 됨
spring.flyway.url={DB_HOST}
spring.flyway.user={DB_USERNAME}
spring.flyway.password={DB_PASSWORD}
Flyway를 사용하기위한 기본 설정이다.
enabled
: Flyway 사용 여부를 나타내는데, 기본값은 true
이다.baseline-on-migrate
: 이미 실행된 버전의 sql
파일은 제외하고 실행하기 위한 옵션이다. flyway-schema-history
라는 테이블을 자동으로 생성해서, 변경 이력을 관리한다.기본적으로 resources.db.migration
패키지 하위에 약속된 파일명으로 .sql
파일을 작성해주면 해당 파일들로 형상관리를 할 수 있게 된다.
V1__파일명.sql
파일은 위와 같이 작성하는데, 상세한 작성법은 아래와 같다.
V
대신 U
, R
이 올 수 있고, 접두사 뒤에 숫자는 버전을 의미하고, 큰 숫자일수록 최신의 버전임을 뜻한다.U
접두사는 Flyway 유료 버전에서만 사용할 수 있는 Undo 기능이다.R
접두사는 한번만 실행하는 것이 아닌 여러번 실행되도 되는 쿼리들을 작성한다. 모든 마이그레이션 스크립트들이 실행된 후에 실행이 되고, 이전 파일과 변경된 경우에 다시 실행된다.__
) 작성해야한다.💡 시작하기 전, 데이터베이스는 미리 생성해둬야한다.
CREATE TABLE if not exists `person` (
`id` bigint unsigned PRIMARY KEY AUTO_INCREMENT,
`name` varchar(255) UNIQUE NOT NULL
);
V1 파일은 init
이라는 이름으로 짓는 게 국룰(?)이다. ㅎㅎ
이렇게 파일을 생성한 후, 서버를 실행해보면 아래와 같이 테이블이 잘 생성되어 있는 것을 확인할 수 있다.
ALTER TABLE `person` ADD COLUMN age INT;
두 번째 버전의 .sql
파일은 age
라는 컬럼을 추가하는 쿼리를 작성해보았다.
다시 서버를 실행해보면 아래와 같이 age
컬럼이 잘 생성되어 있는 것을 확인할 수 있다.
CREATE TABLE if not exists `animal` (
`id` bigint unsigned PRIMARY KEY AUTO_INCREMENT,
`category` varchar(100) NOT NULL,
`name` varchar(255) UNIQUE NOT NULL
);
이번엔 R
접두사를 활용해서 쿼리를 작성해보았다.
서버를 다시 실행해보면, animal
테이블이 잘 생성된 것을 확인할 수 있다.
flyway_schema_history
테이블을 조회해보면, 이렇게 실행된 sql
파일들이 버전과 함께 잘 정리되어 있는 것을 확인할 수 있다.
CREATE TABLE if not exists `animal` (
`id` bigint unsigned PRIMARY KEY AUTO_INCREMENT,
`category` varchar(100) NOT NULL,
`name` varchar(255) UNIQUE NOT NULL comment '동물의 이름 ㅋ'
);
이번엔 R__create_animal_table.sql
파일을 수정해서 서버를 다시 실행해보겠다.
그러면, 이전 파일과 checksum
이 달라지면서 다시 R
파일이 실행된 것을 확인할 수 있다.
예시를 들기 위해서 테이블 생성 쿼리를 R
파일에 작성했지만, R
파일에서는 테이블 생성보다는 지속적으로 수행되어야할 쿼리들을 입력해주는 것이 좋다. 예를 들면, 데이터 초기화 같은 것이 될 수 있을 것 같다.
나는 그동안 개발을 하면서 DB에 변경 사항이 생기면, Schema 파일을 따로 직접 관리하면서, DB에도 한 땀 한 땀 변동사항을 반영해줬었는데 Flyway를 사용하면 코드 레벨에서 모두 관리할 수 있을 것 같아서, 매우 좋은 것 같다. ㅎㅎ
그럼 이번 글은 마치도록 하겠다. 🙏