[java] 자바에서 Liquibase를 사용하여 데이터베이스 스키마 버전 관리하기

데이터베이스 스키마는 애플리케이션 개발 중에 자주 변경되는 요소 중 하나입니다. 스키마 변경을 관리하면 애플리케이션 배포 및 유지 관리 작업이 훨씬 수월해집니다. 이를 위해 Liquibase라는 자바 라이브러리를 사용할 수 있습니다. Liquibase는 XML 또는 YAML 포맷의 변경 로그 파일을 사용하여 데이터베이스 스키마 업데이트를 추적하고 적용하는 기능을 제공합니다.

Liquibase 설정하기

먼저 프로젝트의 의존성에 Liquibase를 추가해야 합니다. Maven 사용자라면 pom.xml 파일에 다음 의존성을 추가하면 됩니다.

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

Gradle을 사용하는 경우 build.gradle 파일에 다음 의존성을 추가하세요.

dependencies {
    implementation 'org.liquibase:liquibase-core:4.6.3'
}

변경 로그 파일 작성하기

Liquibase는 변경 로그 파일을 사용하여 데이터베이스 스키마 변경을 추적합니다. 변경 로그 파일은 db.changelog.xml 또는 db.changelog.yaml와 같은 이름으로 작성할 수 있습니다. 변경 로그 파일은 데이터베이스 스키마 변경에 대한 순차적인 명령문을 포함합니다.

예를 들어, db.changelog.xml 파일을 사용하여 users 테이블을 생성하는 변경 로그를 작성해보겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<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.1.xsd">
    <changeSet id="1" author="yourname">
        <createTable tableName="users">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(255)"/>
            <column name="email" type="varchar(255)"/>
        </createTable>
    </changeSet>
</databaseChangeLog>

위의 예시에서는 users 테이블을 생성하는 changeSet을 정의했습니다. createTable 요소 안에서는 id, name, email과 같은 컬럼들을 정의할 수 있습니다.

Liquibase 사용하기

Liquibase를 사용하여 변경 로그를 데이터베이스에 적용하는 것은 매우 간단합니다. 다음은 실행 예시입니다.

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

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

public class LiquibaseExample {

    public static void main(String[] args) {
        try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "username", "password")) {
            
            JdbcConnection jdbcConnection = new JdbcConnection(connection);
            Liquibase liquibase = new Liquibase("db.changelog.xml", new ClassLoaderResourceAccessor(), jdbcConnection);
            
            liquibase.update("");
            
            System.out.println("DB schema updated successfully.");
            
        } catch (SQLException | LiquibaseException e) {
            e.printStackTrace();
        }
    }

}

위의 예시에서는 MySQL 데이터베이스에서 mydatabase에 연결하여 usernamepassword로 인증합니다. 해당 데이터베이스에 변경 로그 파일 db.changelog.xml을 적용하기 위해 Liquibase 인스턴스를 생성합니다. liquibase.update("") 메서드를 호출하여 변경 로그를 데이터베이스에 적용합니다.

결론

Liquibase를 사용하면 데이터베이스 스키마 버전 관리를 효과적으로 할 수 있습니다. 변경 로그 파일을 작성하고 Liquibase를 사용하여 데이터베이스에 적용하는 것은 매우 간단합니다. 이를 통해 데이터베이스 스키마 변경을 추적하고 애플리케이션 배포 및 유지 관리 작업을 훨씬 수월하게 진행할 수 있습니다.

참고 문서: Liquibase 공식 문서