[java] Liquibase를 사용하여 자바 애플리케이션의 데이터베이스 마이그레이션 백업 관리하기

데이터베이스 마이그레이션은 애플리케이션의 데이터베이스 스키마를 변경 또는 업데이트하는 작업입니다. 이러한 작업은 애플리케이션의 버전 업데이트, 추가적인 기능 구현 또는 버그 수정 등의 이유로 필요할 수 있습니다. 하지만, 데이터베이스 마이그레이션 작업은 데이터 손실이나 문제가 발생할 수 있는 위험을 내포하고 있습니다. 따라서 마이그레이션 작업의 안전성과 백업 관리는 매우 중요합니다.

Liquibase는 자바 애플리케이션에서 데이터베이스 마이그레이션을 관리하기 위한 오픈소스 라이브러리입니다. 이를 사용하면 애플리케이션의 데이터베이스 스키마 변경 작업을 프로그래밍적으로 정의하고 실행할 수 있습니다. 또한, Liquibase는 데이터베이스 스키마 변경이 실패했을 때 롤백을 수행하여 이전 상태로 복구할 수 있는 기능도 제공합니다.

Liquibase 설정하기

Liquibase를 사용하기 위해서는 먼저 프로젝트에 Liquibase를 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음의 의존성을 추가합니다:

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>4.3.5</version>
</dependency>

Gradle을 사용한다면 build.gradle 파일에 다음의 의존성을 추가합니다:

implementation 'org.liquibase:liquibase-core:4.3.5'

마이그레이션 파일 작성하기

마이그레이션 작업을 정의하기 위해 마이그레이션 파일을 작성해야 합니다. 마이그레이션 파일은 주로 XML 또는 YAML 형식으로 작성되며, 데이터베이스 스키마 변경 작업을 기록하는 일련의 변경 세트로 구성됩니다.

다음은 Liquibase 마이그레이션 파일의 예시입니다:

changelog.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.3.xsd">

    <changeSet id="1" author="John Doe">
        <createTable tableName="users">
            <column name="id" type="INT">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="VARCHAR(100)"/>
        </createTable>
    </changeSet>

    <changeSet id="2" author="Jane Smith">
        <addColumn tableName="users">
            <column name="age" type="INT"/>
        </addColumn>
    </changeSet>
</databaseChangeLog>

위의 예제에서는 changelog.xml 파일에 두 개의 changeSet이 있습니다. 첫 번째 changeSet은 users 테이블을 생성하고 두 개의 열(idname)을 추가합니다. 두 번째 changeSet은 users 테이블에 age 열을 추가합니다.

마이그레이션 실행하기

마이그레이션 작업을 수행하려면 Liquibase 명령행 도구를 사용하거나 자바 코드 내에서 Liquibase를 직접 사용할 수 있습니다.

명령행 도구 사용

Liquibase 명령행 도구를 사용하려면 다음과 같은 명령을 실행합니다:

liquibase --changeLogFile=changelog.xml --url=jdbc:postgresql://localhost:5432/db_name --username=username --password=password update

위의 예제에서는 changelog.xml 파일을 사용하여 PostgreSQL 데이터베이스에 마이그레이션 작업을 수행합니다. 데이터베이스 접속 URL, 사용자 이름 및 비밀번호는 실제 환경에 맞게 변경해야 합니다.

자바 코드에서 Liquibase 사용

Liquibase를 자바 코드에서 사용하려면 다음과 같이 코드를 작성합니다:

import liquibase.Liquibase;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.resource.ClassLoaderResourceAccessor;

import java.sql.Connection;
import java.sql.DriverManager;

public class Main {
    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db_name",
                    "username", "password");

            Liquibase liquibase = new Liquibase("changelog.xml", new ClassLoaderResourceAccessor(), 
                    DatabaseFactory.getInstance().findCorrectDatabaseImplementation(
                    new JdbcConnection(connection)));

            liquibase.update("");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 예제에서는 PostgreSQL 데이터베이스에 대한 연결을 설정한 후, Liquibase 객체를 생성하여 changelog.xml 파일을 사용하여 마이그레이션 작업을 수행합니다. 다음으로 liquibase.update("") 메서드를 호출하여 마이그레이션 작업을 실행합니다.

마이그레이션 롤백하기

Liquibase는 마이그레이션 작업이 실패했을 때 롤백을 수행하는 기능을 제공합니다. 롤백을 수행하려면 다음과 같은 명령을 실행하거나 자바 코드 내에서 liquibase.rollback() 메서드를 호출합니다.

명령행 도구 사용

liquibase --changeLogFile=changelog.xml --url=jdbc:postgresql://localhost:5432/db_name --username=username --password=password rollback 1

위의 예제에서는 마지막으로 실행된 changeSet을 롤백합니다.

자바 코드에서 롤백하기

import liquibase.Liquibase;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.resource.ClassLoaderResourceAccessor;

import java.sql.Connection;
import java.sql.DriverManager;

public class Main {
    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db_name",
                    "username", "password");

            Liquibase liquibase = new Liquibase("changelog.xml", new ClassLoaderResourceAccessor(),
                    DatabaseFactory.getInstance().findCorrectDatabaseImplementation(
                    new JdbcConnection(connection)));

            liquibase.rollback(1, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

결론

Liquibase를 사용하여 자바 애플리케이션의 데이터베이스 마이그레이션을 관리할 수 있습니다. 마이그레이션 파일을 작성하고 Liquibase를 실행하면 데이터베이스의 스키마 변경 작업을 손쉽게 관리할 수 있습니다. 또한 롤백 기능을 통해 변경 작업이 실패했을 때 이전 상태로 손쉽게 복구할 수 있습니다. Liquibase를 사용하여 데이터베이스 마이그레이션 백업 관리를 간편하게 수행해보세요.

참고 자료