[java] Liquibase와 함께 사용하는 자바 애플리케이션의 단위 테스트 전략

Liquibase는 데이터베이스 스키마 및 데이터 버전 관리를 지원하는 오픈 소스 라이브러리입니다. 자바 애플리케이션을 개발할 때 Liquibase를 사용하여 데이터베이스 변경을 관리하는 경우, 단위 테스트를 진행할 때 몇 가지 전략을 고려해야 합니다.

1. 테스트용 데이터베이스 사용

단위 테스트를 위해 별도의 테스트용 데이터베이스를 사용하는 것이 좋습니다. 이를 위해 보통 H2, HSQLDB, 또는 내장형 데이터베이스를 사용합니다.

@TestConfiguration
public class TestDatabaseConfig {

    @Bean
    public DataSource dataSource() {
        // 테스트용 데이터베이스 설정
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .build();
    }

    @Bean
    public DataSourceInitializer dataSourceInitializer(DataSource dataSource) {
        // 테스트용 데이터베이스 초기화
        ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScript(new ClassPathResource("db/changelog/changesets/test-data.sql"));
        
        DataSourceInitializer initializer = new DataSourceInitializer();
        initializer.setDataSource(dataSource);
        initializer.setEnabled(true);
        initializer.setDatabasePopulator(populator);
        
        return initializer;
    }
}

@TestConfiguration 어노테이션이 붙은 클래스를 통해 테스트용 데이터베이스를 설정하고, 초기화합니다. ResourceDatabasePopulator를 사용하여 테스트 데이터를 추가할 수 있습니다.

2. 테스트용 데이터베이스 초기화

단위 테스트마다 데이터베이스를 초기화하여 일관된 테스트 환경을 유지하는 것이 중요합니다. 따라서 @BeforeEach 어노테이션을 활용하여 테스트마다 테이블을 초기화합니다.

@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MyServiceTest {

    // ...

    @Autowired
    private DataSource dataSource;

    @Autowired
    private MyService myService;

    @BeforeEach
    public void setupTestDatabase() throws LiquibaseException, SQLException {
        Liquibase liquibase = LiquibaseFactory.createLiquibase(dataSource);
        
        // 테이블 초기화
        liquibase.dropAll();
        liquibase.update("");
    }

    @Test
    void testSomeFunctionality() {
        // ...
    }

    // ...
}

@AutoConfigureTestDatabase 어노테이션을 사용하여 실제 데이터베이스를 사용하도록 설정합니다. LiquibaseFactory를 통해 dataSource를 전달하여 실제 데이터베이스를 초기화합니다.

3. 테스트용 데이터베이스 스키마 버전 관리

Liquibase를 사용하여 데이터베이스 변경을 관리하는 경우, 테스트용 데이터베이스에서도 동일한 스키마 버전을 유지해야 합니다. 이를 위해 LiquibaseFactory 클래스를 사용하여 데이터베이스를 초기화하는 동일한 Liquibase 설정을 적용합니다.

public class LiquibaseFactory {

    public static Liquibase createLiquibase(DataSource dataSource) throws LiquibaseException {
        // 스키마 변경을 관리하는 Liquibase 생성
        Liquibase liquibase = new Liquibase("db/changelog/db.changelog-master.xml", new ClassLoaderResourceAccessor(), new JdbcConnection(dataSource.getConnection()));
        liquibase.update("");

        return liquibase;
    }
}

LiquibaseFactory 클래스를 사용하여 Liquibase 객체를 생성하고 데이터베이스를 초기화합니다. 변경 내역은 db.changelog-master.xml 파일에 정의되어 있습니다. 테스트용 데이터베이스 역시 이 파일을 참조하여 스키마를 유지할 수 있습니다.

결론

Liquibase를 사용하여 데이터베이스 변경을 관리하는 자바 애플리케이션의 단위 테스트 전략을 살펴보았습니다. 테스트용 데이터베이스를 사용하고 초기화하는 방법, 스키마 버전을 관리하는 방법을 확인하였습니다. 이를 통해 테스트를 더욱 안정적으로 수행할 수 있으며, 데이터베이스 변경에 따른 이슈를 미리 파악할 수 있습니다.

참고: