[java] Liquibase를 사용하여 자바 애플리케이션의 다중 환경 데이터베이스 관리하기

애플리케이션을 개발할 때, 다양한 환경에서 데이터베이스를 사용할 수 있어야 합니다. 이를 위해 일반적으로 개발, 테스트, 운영 등 다양한 환경에 맞게 데이터베이스 스키마를 관리해야 합니다. Liquibase는 이러한 문제를 해결하기 위해 사용되는 자바 기반의 오픈 소스 도구입니다. Liquibase를 사용하면 애플리케이션의 데이터베이스 스키마를 버전 관리하고, 다양한 환경에서의 데이터베이스 마이그레이션을 쉽게 수행할 수 있습니다.

Liquibase란?

Liquibase는 데이터베이스 스키마를 관리하기 위한 오픈 소스 도구로, XML 또는 YAML 형식의 변경 세트 파일을 사용하여 데이터베이스의 상태를 관리합니다. 데이터베이스 변경 내역을 변경 세트 파일에 기록하고, Liquibase는 애플리케이션이 시작될 때 이 변경 세트 파일을 읽어 데이터베이스 상태를 업데이트합니다. 또한, 다중 개발자 및 다수의 팀이 협업할 수 있도록 변경 세트 파일을 버전 관리 시스템에 저장할 수 있습니다.

Liquibase 설치 및 설정

  1. Liquibase 다운로드 및 설치
  2. 데이터베이스 연결 설정
    • liquibase.properties 파일을 생성하고, 사용할 데이터베이스의 연결 정보를 설정합니다. 다음은 MySQL 데이터베이스를 사용하는 예시입니다.
    driver: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mydatabase
    username: myusername
    password: mypassword
    
  3. 변경 세트 파일 생성
    • changelogs 디렉토리에 변경 세트 파일을 생성합니다. 변경 세트 파일은 XML 또는 YAML 형식으로 작성할 수 있습니다. 변경 세트 파일은 데이터베이스의 초기 상태 및 각 변경 사항을 정의하는데 사용됩니다.
    <?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-3.8.xsd">
    
        <changeSet author="myname" id="1">
            <createTable tableName="mytable">
                <column name="id" type="INT">
                    <constraints primaryKey="true" nullable="false"/>
                </column>
                ...
            </createTable>
        </changeSet>
    </databaseChangeLog>
    
  4. 애플리케이션에서 Liquibase 사용하기
    • 자바 애플리케이션에서 Liquibase를 사용하려면 다음과 같이 설정합니다.
    import liquibase.Liquibase;
    import liquibase.database.Database;
    import liquibase.database.DatabaseFactory;
    import liquibase.database.jvm.JdbcConnection;
    import liquibase.exception.LiquibaseException;
    import liquibase.resource.ClassLoaderResourceAccessor;
    
    public class LiquibaseRunner {
        public static void main(String[] args) {
            try (Connection connection = getConnection()) {
                Database database = DatabaseFactory.getInstance()
                    .findCorrectDatabaseImplementation(new JdbcConnection(connection));
                Liquibase liquibase = new Liquibase("changelogs/changelog.xml",
                    new ClassLoaderResourceAccessor(), database);
                liquibase.update("");
            } catch (SQLException | LiquibaseException e) {
                // 예외 처리
            }
        }
    
        private static Connection getConnection() throws SQLException {
            // 데이터베이스 연결 정보 반환
        }
    }
    

데이터베이스 마이그레이션

Liquibase를 사용하여 데이터베이스를 마이그레이션하는 방법은 간단합니다.

  1. 변경 세트 파일 작성
    • 변경 사항이 있는 경우, 변경 세트 파일에 변경 내역을 추가합니다. 각 변경 세트는 고유한 버전 번호 또는 태그를 가지고 있으며, 순차적으로 적용됩니다.
  2. 애플리케이션 실행
    • 애플리케이션을 실행하면 Liquibase는 변경 세트 파일의 내용을 읽어 데이터베이스 상태를 업데이트합니다. 이미 실행된 변경 세트는 건너뛰고 미처 실행되지 않은 변경 세트만 적용됩니다.

Liquibase를 사용하여 데이터베이스를 마이그레이션하면 애플리케이션의 다중 환경에서 일관된 데이터베이스 스키마를 유지할 수 있습니다. 또한, 변경 세트 파일을 통해 변경 내역을 추적할 수 있으므로 데이터베이스의 변경 이력을 관리하기 용이합니다.

더 자세한 내용은 Liquibase 공식 문서를 참고하시기 바랍니다.