본문 바로가기

STUDY/기타

Flyway를 활용한 DB Migration

자주 겪는 일

 

일반적으로 소스, 서버, DB 등 서비스 환경은 개발, 검증, 운영으로 나누어져 있다. 개발자들은 이렇게 나누어진 환경 때문에 번거로운 과정들을 거쳐야 한다. 프로젝트를 진행하다 보면 기존의 소스와 테이블을 바꾸어야 하는 경우가 자주 발생 한다. 실제로 이전에 진행했던 프로젝트에서는 기획 변경으로 인해 필요한 데이터가 바뀌면 1) 로컬의 소스와 DB를 수정하여 작업하고, 2) 개발계 DB 수정을 요청하고, 개발계에 소스를 올리고 배포한 후, 3) 검증, 운영계도 같은 과정을 수행하였다.

 

하지만 위와 같은 과정들은 번거로운 뿐더러 여러 문제를 발생시켰다. 담당자가 직접 DB를 수정하다보니 실수로 계획한 것과 다르게 반영되어 장애가 발생하거나, DB 담당자 부재시 소스 배포도 함께 불가능해지는 문제도 있었다. 그리고 이전 소스로 롤백할 경우 DB도 다시 원복해야 하는데 이는 쉬운 일이 아니었다. 개발자라면 이러한 문제들을 한번쯤은 경험해봤을 것이다.

 

 


Flyway란

 

Flyway의 개발자들은 소스와 DB가 각각 관리되는 것을 문제의 원인으로 본 것 같다. 소스가 바뀌면 DB가 바뀌고 DB가 바뀌면 소스가 바뀌는 것이 일반적이다. 특히 ORM 기술을 사용한 프로젝트라면 더욱 그럴것이다. 이러한 상황에서 소스와 DB가 별도로 관리되고 반영된다면 문제가 생기는 것이 당연하다. Flyway는 DB를 소스에서 관리하도록 하여 앞선 문제들을 해결하고자 하는 DB Migration 도구이다.

 

 


Flyway 맛보기

 

Flyway는 CLI, API(Java), gradle, maven 와 같이 여러 방법으로 사용할 수 있다. 공식 문서(https://documentation.red-gate.com/fd/flyway-documentation-138346877.html)를 참고하면 각각의 사용법을 알 수 있다. 여기서는 gradle을 사용하여 간단하게 Flyway를 사용해보겠다.

 

// build.gradle
plugins {
	...
	id "org.flywaydb.flyway" version "9.17.0"
    ...
}

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

flyway {
    url = 'url'
    user = 'name'
    password = 'password'
}

 

gradle에 Flyway관련 플러그인과 디펜던시, 그리고 설정을 추가해주었다.

 

//  resources/db/migration/V1__init.sql
create table public.employee
(
    id                  bigint generated by default as identity primary key,
    name                varchar(255),
    created_at          timestamp(6),
    updated_at          timestamp(6)
);

 

 

Flayway의 기본 sql 파일 경로인 reouseces/db/migration에 V1 버전의 스키마를 정의해주었다. 파일명 규칙은 위 그림과 같다.

 

 

> gradle flywayMigrate

 

flyway_schema_history
employee

 

이후 gradle flywayMigrate 명령어를 실행하면 Flyway의 DB 버전 관리용 테이블과 V1__init.sql에서 정의한 테이블이 생성된 것을 볼 수 있다.

 

 


Flyway 한계 및 대안

 

Flyway는 DB를 소스단에서 관리하여 소스와 DB의 관리포인트 불일치로 인한 문제를 해결하였다. 그리고 DB 변경이력을 버전으로 관리하여 모든 이력이 남도록 하였다. 하지만 Flyway는 스냅샷, Undo 등의 주요 기능은 유료 제공하고 있어서 비용적인 문제가 발생할 수 있다. 그리고 Undo 등의 기능은 아직 불안정하여 사용하는데 주의가 필요하다.

 

Flyway의 대안으로는 liquibase 가 있다. liquibase는 Flyway에서는 유료인 주요기능을 무료로 이용할 수 있고, rollback 전략도 Flyway에 비하면 안정적이라는 평가를 받는다. 하지만 Flyway에 비해 세팅 및 사용법이 복잡하여 상황에 따라 적절하게 선택해야 한다.

 

 

728x90