데이터 베이스 형상관리(Migration)툴 비교 Flyway vs Liquibase

Jaeyoung·2024년 2월 6일
0
post-thumbnail

데이터 베이스 형상관리는 테이블 구조, 스키마, 뷰, 저장 프로시저, 데이터 자체의 변경에 대한 형상을 관리하는 것입니다. 혼자 개발 할 때는 상관이 없지만 여러명이 같이 개발을 하게 된다면 아래와 같은 문제가 발생 할 수 있습니다.

  • 스키마 충돌 - 여러명이 동일한 데이터베이스 스키마에 대해 서로 다른 변경을 시도할 수 있습니다. 이러한 경우 일관성과 예상치 못한 동작을 발생시킬 수 있습니다.
  • 데이터 손실 - 실수로 데이터를 삭제하거나 잘못 수정할 수 있습니다.
  • 버전 관리 - 버전 관리가 되지않아 언제 누가 데이터베이스를 수정했는지 알 수 없습니다.
  • 배포 오류 - 환경별 스키마가 달라 어플리케이션 배포에 영향을 끼칠 수 있습니다.
  • 테스트 - 데이터베이스 변경 사항에 대해 충분한 테스트가 이루어지지 않아 , 버그나 문제가 발생할 수 있습니다.

Flyway

동작

  • 빈 데이터베이스에서 Flyway를 동작시키는 경우 Schema History Table을 새로 생성해줍니다.
  • Schema History Table은 데이터베이스의 상태를 추적하기 위해 사용됩니다.
  • 해당 테이블이 생성된 직후 마이그레이션을 위해 파일시스템이나 어플리케이션의 클래스패스를 스캔합니다. 이때 어플리케이션은 Sql 또는 Java로 작성할 수 있습니다.
  • 마이그레이션은 버전별로 정렬되어 순차적으로 실행합니다. 버전 번호가 현재 버전으로 표시된 버전보다 낮거나 같으면 무시됩니다.
  • DDL과 DML을 통해 데이터베이스를 변경하고 싶다면 현재 버전보다 높게 설정해 변경사항을 반영할 수 있습니다.

특징

  • Java 7버전 이상 그리고 JDBC만 있으면 사용가능
  • Java 및 일반 SQL로 마이그레이션
  • 마이그레이션을 위해 파일 시스템 혹은 클래스 경로를 기반으로 SQL과 Java로 작성된 어플리케이션을 자동으로 찾습니다.
  • 데이터베이스가 일관적이지 않거나 마이그레이션에 실패하면 앱을 실행하지 않습니다.
  • 스키마를 삭제하지않고도 스키마에 있는 테이블, 뷰, 트리거를 삭제할 수 있습니다.
  • 클러스터 환경에 안전하기 때문에 여러 머신을 병렬로 마이그레이션 가능합니다.
  • 다양한 데이터베이스 지원
  • CLI나 Docker를 통해 CI/CD 파이프라인에 통합

무료 버전

  • API/CLI - Flyway는 Command Line Interface(CLI) 및 Application Programming Interface(API)를 통해 사용할 수 있습니다. 이를 통해 사용자는 명령줄이나 프로그래밍적으로 데이터베이스 마이그레이션을 관리할 수 있습니다.
  • Desktop GUI - 그래픽 사용자 인터페이스(GUI)를 통해 마이그레이션을 관리할 수 있습니다.
  • Basic Commands
    • Migrate - 데이터베이스에 새로운 마이그레이션을 적용합니다.
    • Clean - 데이터베이스의 모든 객체를 삭제합니다 (주의: 이 명령은 개발 환경에서만 사용하는 것이 좋습니다).
    • Info - 현재 적용된 마이그레이션과 펜딩 상태의 마이그레이션에 대한 정보를 제공합니다.
    • Validate - 적용된 마이그레이션 스크립트가 현재 데이터베이스 스키마와 일치하는지 검증합니다.
    • Baseline - 기존의 비버전화된 데이터베이스에 초기 버전을 설정합니다. 이후의 마이그레이션은 이 기준점을 기반으로 적용됩니다.
    • Repair - 마이그레이션 메타데이터를 수정합니다. 예를 들어, 실패한 마이그레이션의 로그를 정리하거나 체크섬 오류를 해결할 때 사용합니다.

유료 버전

  • Dry Run - 마이그레이션을 실제로 적용하기 전에 예상되는 결과를 미리 확인할 수 있는 기능입니다. 이를 통해 변경 사항이 실제 데이터베이스에 어떤 영향을 미칠지 사전에 평가할 수 있습니다.
  • Undo Migration Scripts - 이전에 적용된 마이그레이션을 되돌릴 수 있는 스크립트를 작성하고 실행할 수 있습니다.
  • Cherry Pick - 특정 마이그레이션만 선택적으로 적용할 수 있습니다.
  • Skip Migrations - 특정 마이그레이션을 건너뛰고, 시스템이 마치 해당 마이그레이션이 이미 적용된 것처럼 표시하는 기능입니다.
  • Object-Level Versioning - 데이터베이스 객체(테이블, 뷰, 스토어드 프로시저 등)별로 세부적인 버전 관리를 할 수 있는 기능입니다.
  • Built-in Git Client - Flyway 내에서 직접 Git 명령을 실행할 수 있는 내장 Git 클라이언트입니다.

사용 후기

  • 좋았던 부분
    • 엄청 단순하고 간단합니다.
    • intellij 플러그인 Jpa Buddy랑 같이 사용하면 스키마 변경에 대한 마이그레이션 파일을 만들어 주기 때문에 별도의 작업 없이 마이그레이션을 진행할 수 있습니다. <- 완벽하게 지원하진 않아 사실상 거의 사용성 X
    • 마이그레이션 과정에서 문제가 발생할 경우 어플리케이션 실행을 막아 잘못된 배포를 방지할 수 있습니다.
  • 아쉬웠던 부분
    • 이전에 적용된 마이그레이션을 되돌리려면 포워드 마이그레이션 방식으로 설계되어 수동으로 Undo 스크립트를 작성해 실행해야합니다.
    • 데이터베이스 스키마 마이그레이션을 관리하는 용도로 만들어졌기 때문에 데이터에 대한 스냅샷을 지원하지 않습니다.

Liquibase

동작

  • Liquibase는 Changelog를 통해 데이터베이스의 변경사항을 순차적으로 관리합니다.
  • Changelog의 형식은 각기 다른 데이터베이스에 구애받지 않기 위해 SQL, XML, JSON, YAML로 구성되어있습니다.
  • Changelog는 Changeset으로 구성되어잇는데 Changeset은 Liquibase에서 변경 이력에 대한 기본 작업 단위 입니다.
  • Changeset은 Chnage Types들을 포함하고있는데 Change Type를 통해 새 테이블을 만들거나 기존 테이블에 열을 추가하는 등 변경 사항이 수행하는 작업을 지정할 수 있습니다.
  • Change Types은 데이터베이스에 독립적인 XML, YAML 또는 JSON 형식의 변경 사항으로, Liquibase로 데이터베이스를 업데이트하기 위해 지정할 수 있습니다. ChangeType은 데이터베이스에 적용되는 SQL 문(예: CREATE TABLE)에 해당합니다. Changelog에서 Changeset 내에서 사용할 ChangeType을 지정합니다.

주의할점

Changeset에 하나의 ChangeType만 포함하는 것이 가장 좋습니다. 이렇게 하면 자동 커밋 문이 실패하여 데이터베이스가 예기치 않은 상태에 빠지는 것을 방지할 수 있습니다. 만약 여러 ChangeType을 포함하는 경우 이 중 하나라도 실패하면 원자성을 보장하지 않아 전체 changeset이 일관성 없는 상태로 남을 수 있습니다. 위와 같은 문제가 있기도 하고 하나의 ChangeType만 포함시키면 문제가 발생했을 때 쉽게 특정 chagneset만 롤백시키거나 수정할 수 있기 때문에 복구에도 용이해 Changeset에 하나의 ChangeType만 포함하는걸 권장합니다.

Liquibase Command

Liquibase는 마이그레이션에 도움을 주는 몇개의 Command를 지원합니다. 아래는 주로 사용하는 Command 집합에 대한 설명입니다.

Init

Liquibase에서 init 명령은 일반적으로 새로운 프로젝트를 시작하거나 기존 프로젝트에 Liquibase를 초기 설정하는 데 사용되며 Liquibase 구성과 관련된 파일들을 생성하고 기본 설정을 준비합니다.

  1. 구성 파일 생성 - Liquibase의 구성을 위한 파일(liquibase.properties 또는 changelog.xml 등)을 생성합니다. 이 파일들은 데이터베이스 접속 정보, 변경 로그 파일 경로 등 Liquibase가 작동하기 위해 필요한 기본 설정을 포함합니다.
  2. Changelog 파일 생성 - Liquibase는 데이터베이스 변경 사항을 관리하기 위해 Changelog 파일을 사용합니다. init 명령은 이러한 변경 로그 파일의 초기 버전을 생성할 수 있습니다.
  3. 프로젝트 디렉토리 구조 설정 - 특정 프로젝트 구조 내에서 Liquibase를 사용하기 위해 필요한 디렉토리 구조를 설정할 수 있습니다.

Update

정의된 Changelog(Migration Script)를 데이터베이스에 적용하는 데 사용되어 데이터베이스 스키마를 최신 상태로 업데이트하는 데 필요한 작업을 수행합니다.

  1. Changelog 적용 - update 명령은 변경 로그 파일에 정의된 모든 ChangeSets를 순서대로 실행합니다. 이 변경 세트들은 데이터베이스 스키마를 생성, 수정, 삭제하는 데 사용됩니다.
  2. 데이터베이스 스키마 업데이트 - 테이블 생성, 컬럼 추가, 인덱스 변경, 데이터 수정 등과 같은 데이터베이스 스키마 변경 작업을 실행합니다.
  3. 데이터베이스 무결성 유지 - Liquibase는 이미 적용된 변경 세트를 추적하여 동일한 변경이 중복으로 적용되지 않도록 합니다. 이를 위해 DATABASECHANGELOG 테이블을 사용하여 어떤 변경 세트가 이미 적용되었는지 기록합니다.

Rollback

데이터베이스 변경 사항을 이전 상태로 되돌리는 기능을 수행합니다. 이 명령은 주로 데이터베이스에 적용된 최근 변경들이 오류를 일으키거나 예상과 다른 결과를 가져왔을 때 사용됩니다.

  1. 변경 사항 되돌리기 - 데이터베이스에 적용된 특정 변경을 이전 상태로 되돌립니다. 이는 rollback 명령에 지정된 기준에 따라 실행됩니다.
  2. 다양한 롤백 옵션 - Liquibase는 여러 방법으로 롤백을 지정할 수 있습니다. 예를 들어, 태그, 날짜/시간, 변경 로그의 특정 버전으로 롤백할 수 있습니다.
  3. 롤백 순서 - 롤백은 적용된 변경 사항의 역순으로 수행됩니다. 즉, 가장 최근의 변경부터 순차적으로 이전 상태로 되돌립니다.

롤백하기 전에 백업과 테스트를 해보는 것이 좋습니다.

Database inspection

데이터베이스의 현재 상태를 검사하고 분석하는 데 사용되는 명령어 집합입니다. 이 명령어들은 데이터베이스 스키마, 객체, 설정 등에 대한 상세 정보를 제공하며, 데이터베이스의 현재 구성과 구조를 이해하는 데 도움을 줍니다.

  1. status - 아직 데이터베이스에 적용되지 않은 변경 사항의 수와 세부 정보를 보여줍니다. 이는 변경 로그 파일과 현재 데이터베이스 상태를 비교하여 어떤 변경 사항이 대기 중인지 파악할 수 있게 합니다.
  2. history - 데이터베이스에 적용된 변경 로그의 히스토리를 보여줍니다. 이 명령은 언제 어떤 변경 사항이 적용되었는지의 기록을 제공합니다.
  3. diff - 두 데이터베이스 간의 차이점을 비교합니다. 이는 주로 현재 데이터베이스와 기준 데이터베이스 간의 스키마 차이를 확인하는 데 사용됩니다.
  4. generateChangelog - 현재 데이터베이스의 스키마를 기반으로 변경 로그 파일을 생성합니다. 이는 기존 데이터베이스의 스키마를 Liquibase 형식으로 문서화하고자 할 때 유용합니다.
  5. snapshot - 현재 데이터베이스의 스냅샷을 생성합니다. 이는 데이터베이스의 스키마와 구조에 대한 전체적인 정보를 제공합니다.

Liquibase Parameter

Liquibase에서 파라미터(Parameter)는 Liquibase 구성과 마이그레이션 스크립트에서 동적으로 값을 대체하는 데 사용되는 변수입니다. 이러한 파라미터는 마이그레이션 스크립트의 재사용성을 높이고, 다양한 환경에서의 마이그레이션을 용이하게 하며, 보다 유연한 데이터베이스 변경 관리를 가능하게 합니다.

  1. 환경별 설정 - 다른 데이터베이스 환경(개발, 테스트, 프로덕션 등)에서 서로 다른 설정을 적용할 때 파라미터를 사용합니다. 예를 들어, 데이터베이스 URL, 사용자 이름, 비밀번호 등을 각 환경에 맞게 동적으로 지정할 수 있습니다.
  2. Changelog 파일 재사용 - 마이그레이션 스크립트에서 파라미터를 사용하면, 동일한 스크립트를 다양한 상황이나 환경에서 재사용할 수 있습니다. 예를 들어, 테이블 이름이나 컬럼 이름을 파라미터로 지정하여 여러 데이터베이스 스키마에 동일한 변경을 적용할 수 있습니다.
  3. 커맨드 라인에서의 오버라이드 - 커맨드 라인에서 파라미터 값을 지정하여 마이그레이션 실행 시 동적으로 값을 변경할 수 있습니다.

사용 후기

종았던 부분

  • 많은 기능을 지원해 다방면으로 사용할 수 있다는 생각이 들었습니다.
  • 특히 복구와 스냅샷 기능 관점으로 봤을 때 제대로 형상관리가 된다는 생각이 들었습니다.
  • 데이터베이스 DIFF 기능이 있어 변경사항에 대해 쉽게 처리 가능합니다.

아쉬웠던 부분

  • 많은 기능을 제공하기 때문에 그만큼 알아야할 지식도 많고 복잡합니다.
  • 초기에 프로젝트 생성시 설정 할게있습니다.
  • 어떤 Changelog를 적용할지는 직접 설정해줘야합니다.

결론

내가 간단한 기능만 쉽게 이용하고 편하게 쓰고싶다면 Flyway를 사용하시면 되고 운영 관점에서 여러가지 다양한 기능을 사용해야한다면 Liquibase를 사용하면됩니다.

profile
Programmer

0개의 댓글