Flyway를 통한 DB 형상관리 (w. Spring)

Kai·2024년 7월 8일
0

스프링

목록 보기
16/18

글에서 사용한 코드가 있는 깃헙

👀 Flyway


Flyway는 데이터베이스 마이그레이션 도구이다.
개념적으로 서로 다른 DB끼리의 마이그레이션을 하는 거라기 보단 하나의 개념적인 DB를 점진적으로 발전시켜나가고, 관리할 수 있게 도와준다는 의미에서의 마이그레이션 도구로 보면 된다.



🔨 Flyway 사용하기


1) build.gradle

dependencies {
	...
	implementation 'org.flywaydb:flyway-core'
	implementation 'org.flywaydb:flyway-mysql'
    ...
}

Gradle을 빌드툴로써 사용하는 경우, 위와 같이 라이브러리를 명시해주면 Flyway를 사용할 수 있게 된다.
MySQL을 데이터베이스로 사용하고 있다면, org.flywaydb:flyway-mysql로 같이 명시해준다.

2) 설정

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라는 테이블을 자동으로 생성해서, 변경 이력을 관리한다.

3) 마이그레이션 파일 생성 경로

기본적으로 resources.db.migration 패키지 하위에 약속된 파일명으로 .sql파일을 작성해주면 해당 파일들로 형상관리를 할 수 있게 된다.

4) 파일 작성 규칙

V1__파일명.sql

파일은 위와 같이 작성하는데, 상세한 작성법은 아래와 같다.

  • V대신 U, R이 올 수 있고, 접두사 뒤에 숫자는 버전을 의미하고, 큰 숫자일수록 최신의 버전임을 뜻한다.
  • U 접두사는 Flyway 유료 버전에서만 사용할 수 있는 Undo 기능이다.
  • R 접두사는 한번만 실행하는 것이 아닌 여러번 실행되도 되는 쿼리들을 작성한다. 모든 마이그레이션 스크립트들이 실행된 후에 실행이 되고, 이전 파일과 변경된 경우에 다시 실행된다.
  • 버전을 나타내는 접두사와 파일명 사이는 언더바를 2개(__) 작성해야한다.


💻 테스트


💡 시작하기 전, 데이터베이스는 미리 생성해둬야한다.

1) V1__init.sql

CREATE TABLE if not exists `person` (
    `id` bigint unsigned PRIMARY KEY AUTO_INCREMENT,
    `name` varchar(255) UNIQUE NOT NULL
);

V1 파일은 init이라는 이름으로 짓는 게 국룰(?)이다. ㅎㅎ
이렇게 파일을 생성한 후, 서버를 실행해보면 아래와 같이 테이블이 잘 생성되어 있는 것을 확인할 수 있다.

2) V2__add_column_to_person.sql

ALTER TABLE `person` ADD COLUMN age INT;

두 번째 버전의 .sql파일은 age라는 컬럼을 추가하는 쿼리를 작성해보았다.
다시 서버를 실행해보면 아래와 같이 age 컬럼이 잘 생성되어 있는 것을 확인할 수 있다.

3) R__create_animal_table.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
);

이번엔 R접두사를 활용해서 쿼리를 작성해보았다.
서버를 다시 실행해보면, animal테이블이 잘 생성된 것을 확인할 수 있다.

4) 중간 점검

flyway_schema_history 테이블을 조회해보면, 이렇게 실행된 sql파일들이 버전과 함께 잘 정리되어 있는 것을 확인할 수 있다.

5) R 파일 다시 실행시키기

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를 사용하면 코드 레벨에서 모두 관리할 수 있을 것 같아서, 매우 좋은 것 같다. ㅎㅎ

그럼 이번 글은 마치도록 하겠다. 🙏



🙏 참고

0개의 댓글