[java] 자바 애플리케이션에서 Liquibase를 사용하여 테스트 데이터 관리하기

Liquibase는 데이터베이스 스키마 버전 관리 도구로서, 데이터베이스의 스키마 변경과 마이그레이션 작업을 관리하는 데 사용됩니다. 이 글에서는 Liquibase를 사용하여 자바 애플리케이션에서 테스트 데이터를 관리하는 방법에 대해 알아보겠습니다.

1. Liquibase 설정

먼저, Maven 프로젝트의 pom.xml 파일에 다음 의존성을 추가합니다:

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

다음으로, Liquibase 설정 파일을 생성합니다. 기본적으로 src/main/resources 폴더에 liquibase.properties 파일을 생성하고 다음과 같이 작성합니다:

changeLogFile=db/changelog/db.changelog-master.xml
url=jdbc:mysql://localhost:3306/mydatabase
username=db_username
password=db_password

위 예제에서 changeLogFile은 Liquibase 변경 로그 파일의 경로를, url은 데이터베이스 연결 URL을, usernamepassword는 데이터베이스의 로그인 정보를 나타냅니다.

2. 테스트 데이터 작성

Liquibase를 사용하여 테스트 데이터를 작성하기 위해서는 변경 로그 파일에 변경 세트(change set)를 추가해야 합니다. src/main/resources/db/changelog/ 폴더에 새로운 XML 파일을 생성하고 다음과 같이 작성합니다:

<?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.5.xsd">
    <changeSet id="initial_data" author="your_name">
        <sql>
            INSERT INTO users (id, username, email) VALUES (1, 'user1', 'user1@example.com');
            -- Add more data here
        </sql>
    </changeSet>
</databaseChangeLog>

위 예제에서 changeSet은 테스트 데이터를 추가하는 SQL 스크립트를 포함하고 있습니다. idauthor는 변경 세트의 고유 식별자이며, SQL문은 sql 태그 안에 작성됩니다.

3. 테스트에서 Liquibase 사용

테스트 클래스에서 Liquibase를 사용하여 테스트 데이터를 로드하려면 다음과 같이 테스트 클래스를 작성합니다:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
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 MyTest {

    private static final String CHANGELOG_FILE = "classpath:/db/changelog/db.changelog-master.xml";
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydatabase";
    private static final String DATABASE_USERNAME = "db_username";
    private static final String DATABASE_PASSWORD = "db_password";

    @BeforeEach
    public void setup() throws LiquibaseException, SQLException {
        Connection connection = DriverManager.getConnection(DATABASE_URL, DATABASE_USERNAME, DATABASE_PASSWORD);
        JdbcConnection jdbcConnection = new JdbcConnection(connection);
        Liquibase liquibase = new Liquibase(CHANGELOG_FILE, new ClassLoaderResourceAccessor(), 
                                            DatabaseFactory.getInstance().findCorrectDatabaseImplementation(jdbcConnection));
        liquibase.update("test"); // 테스트 데이터 로드
    }

    @Test
    public void testSomething() {
        // 테스트 코드 작성
    }
}

위 예제에서 setup 메소드는 각 테스트가 실행되기 전에 Liquibase를 초기화하고 변경 로그 파일을 기반으로 테스트 데이터를 로드합니다. testSomething 메소드는 실제 테스트를 수행하는 메소드입니다.

참고 자료