데이터베이스 마이그레이션 도구 비교 및 실무 적용 가이드: Flyway vs Liquibase
데이터베이스 스키마 변경 관리를 위한 Flyway와 Liquibase의 특징, 장단점, 실제 적용 시 고려사항을 비교 설명하여 개발자 및 메이커의 효율적인 도구 선택과 활용을 돕습니다.
데이터베이스 마이그레이션 도구 비교 및 실무 적용 가이드
데이터베이스 스키마 변경 사항을 효과적으로 관리하고 추적하는 것은 복잡한 소프트웨어 개발에서 필수적인 부분입니다. 특히 팀 협업 환경이나 CI/CD 파이프라인에서는 일관성 있고 자동화된 스키마 관리가 중요합니다. Flyway와 Liquibase는 이러한 데이터베이스 마이그레이션 관리를 위한 대표적인 오픈소스 도구이며, 각각의 특징과 장단점을 이해하고 프로젝트에 적합한 도구를 선택하는 것이 중요합니다.
1. 데이터베이스 마이그레이션이란?
데이터베이스 마이그레이션은 애플리케이션의 새로운 버전 출시 또는 기능 변경에 따라 데이터베이스 스키마(테이블, 컬럼, 인덱스, 제약 조건 등)를 변경, 업데이트, 또는 생성하는 과정을 의미합니다. 이러한 변경 사항은 SQL 스크립트 형태로 작성되며, 마이그레이션 도구를 통해 순차적으로 적용됩니다.
마이그레이션이 필요한 이유:
- 버전 관리: 변경 이력을 기록하고 특정 시점으로 롤백할 수 있습니다.
- 협업: 여러 개발자가 동시에 데이터베이스 변경 사항을 충돌 없이 관리할 수 있습니다.
- 자동화: CI/CD 파이프라인에 통합하여 배포 프로세스를 자동화할 수 있습니다.
- 일관성: 모든 환경(개발, 테스트, 운영)에서 동일한 스키마를 유지할 수 있습니다.
2. Flyway
Flyway는 Java 기반의 오픈소스 데이터베이스 마이그레이션 도구로, 간단하고 직관적인 사용법을 강점으로 합니다. SQL 스크립트 기반으로 동작하며, 파일명 규칙을 통해 마이그레이션 순서를 자동으로 인식합니다.
주요 특징:
- SQL 중심: 모든 마이그레이션은 SQL 파일로 작성됩니다. (Java API 지원)
- 명명 규칙:
V<Version>__<Description>.sql(예:V1__create_users_table.sql) 형태의 파일명으로 버전을 관리합니다. - 자동화된 버전 관리: Flyway는 데이터베이스 내에
flyway_schema_history테이블을 생성하여 적용된 마이그레이션 스크립트의 히스토리를 기록합니다. - 단순성: 설정이 간단하고 배우기 쉽습니다.
장점:
- SQL에 익숙한 개발자에게 친숙합니다.
- 초기 설정 및 사용이 매우 간편합니다.
- 성능이 우수합니다.
단점:
- SQL 파일 외의 복잡한 로직(예: 조건부 실행)을 구현하기 어렵습니다.
- 버전 간의 변경 사항을 SQL 외의 다른 형식으로 정의하기 어렵습니다.
기본 사용법 (CLI 기준):
- 설치: Flyway CLI를 다운로드하거나 Maven/Gradle 플러그인을 사용합니다.
- 설정:
conf/flyway.conf파일에 데이터베이스 연결 정보, 스크립트 위치 등을 설정합니다. - 마이그레이션 파일 생성:
sql디렉토리에V<Version>__<Description>.sql형식으로 SQL 파일을 생성합니다. - 명령 실행:
flyway migrate: 최신 버전으로 마이그레이션합니다.flyway info: 적용된 마이그레이션 정보를 확인합니다.flyway repair: 히스토리 테이블의 오류를 복구합니다.flyway baseline: 초기 마이그레이션 버전을 설정합니다.
간단 예시:
V1__create_users_table.sql파일 내용:CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );V2__add_email_to_users.sql파일 내용:ALTER TABLE users ADD COLUMN email VARCHAR(100) UNIQUE;
3. Liquibase
Liquibase는 XML, YAML, JSON, 또는 SQL 형식으로 마이그레이션 스크립트를 작성할 수 있는 유연성이 높은 도구입니다. SQL 외에 Groovy, Java 등의 언어를 사용하여 복잡한 변경 로직도 구현할 수 있습니다.
주요 특징:
- 다양한 형식 지원: XML, YAML, JSON, SQL 등 다양한 형식으로 변경 사항(changeset)을 정의할 수 있습니다.
- 상태 기반: 특정 시점의 데이터베이스 상태를 정의하고, 해당 상태로 만들기 위한 변경 사항들을 적용합니다.
- 조건부 실행: 특정 조건에 따라 변경 사항을 실행하거나 건너뛸 수 있습니다.
- 데이터 변경 관리: 스키마 변경뿐만 아니라 데이터 변경도 관리할 수 있습니다.
- 상태 추적:
databasechangelog및databasechangeloglock테이블을 사용하여 마이그레이션 상태를 관리합니다.
장점:
- SQL 외 다양한 형식으로 스크립트 작성 가능 (유연성 높음)
- 복잡한 조건부 로직 및 데이터 변경 관리에 용이
- SQL에 익숙하지 않은 개발자도 쉽게 접근 가능
단점:
- XML/YAML 등 형식에 익숙해지는 데 시간이 걸릴 수 있습니다.
- Flyway에 비해 초기 설정 및 사용법이 다소 복잡할 수 있습니다.
- SQL 파일만 사용하는 경우, Flyway보다 성능 오버헤드가 있을 수 있습니다.
기본 사용법 (CLI 기준):
- 다운로드: Liquibase CLI를 다운로드합니다.
- 설정:
liquibase.properties파일에 데이터베이스 연결 정보, 변경 스크립트 디렉토리 등을 설정합니다. - 변경 파일 생성:
src/main/resources/db/changelog와 같은 경로에 XML, YAML, JSON, SQL 형식으로 변경 파일(e.g.,db.changelog-master.xml)을 생성하고, 각 변경 파일 내에 개별 변경 사항(changeset)을 정의합니다.db.changelog-master.xml(마스터 파일 예시):<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.19.0.xsd"> <include file="classpath:/db/changelog/001-create-users-table.xml"/> <include file="classpath:/db/changelog/002-add-email-to-users.xml"/> </databaseChangeLog>001-create-users-table.xml파일 내용:<changeSet id="1" author="developer"> <createTable tableName="users"> <column name="id" type="INT" autoIncrement="true"> <constraints primaryKey="true"