복붙노트

[SPRING] XML 구성없이 @Configuration을 사용하여 데이터베이스 초기화

SPRING

XML 구성없이 @Configuration을 사용하여 데이터베이스 초기화

XML 파일을 만들 필요없이 데이터베이스를 초기화하는 방법을 알고 싶습니다.

나는 이미 잘 작동하는 이런 종류의 초기화를 사용하지만 현재의 경우에는 XML을 만들고 싶지 않다.

<jdbc:initialize-database data-source="dataSource">
  <jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
  <jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/>
</jdbc:initialize-database>

나는 내장 데이터베이스를 만들 수 있다는 것을 알고있다 :

EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql").build();

필자의 경우, 데이터베이스와 스키마는 Liquibase를 사용하여 생성됩니다.

스프링과 사용자 정의 된 데이터 세트로 초기화하고 매번 새로운 XML 파일을 만들 필요가 없습니다.

가능한가?

해결법

  1. ==============================

    1.@Configuration 클래스 내부의 다음 코드 줄이 작동 할 수 있습니다.

    @Configuration 클래스 내부의 다음 코드 줄이 작동 할 수 있습니다.

    @Value("classpath:com/foo/sql/db-schema.sql")
    private Resource schemaScript;
    
    @Value("classpath:com/foo/sql/db-test-data.sql")
    private Resource dataScript;
    
    @Bean
    public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
        final DataSourceInitializer initializer = new DataSourceInitializer();
        initializer.setDataSource(dataSource);
        initializer.setDatabasePopulator(databasePopulator());
        return initializer;
    }
    
    private DatabasePopulator databasePopulator() {
        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScript(schemaScript);
        populator.addScript(dataScript);
        return populator;
    }
    
  2. ==============================

    2.자신 만의 schema.sql을 만들어 src / main / resources-folder에 넣어야합니다.

    자신 만의 schema.sql을 만들어 src / main / resources-folder에 넣어야합니다.

    import javax.sql.DataSource;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.jdbc.datasource.SimpleDriverDataSource;
    import org.springframework.jdbc.datasource.init.DatabasePopulator;
    import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
    import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
    
    @Configuration
    public class DataSourceInitializer {
    
        @Bean(name = "dataSource")
        public DataSource getDataSource(){
            DataSource dataSource = createDataSource();
            DatabasePopulatorUtils.execute(createDatabasePopulator(), dataSource);
            return dataSource;
        }
    
        private DatabasePopulator createDatabasePopulator() {
            ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
            databasePopulator.setContinueOnError(true);
            databasePopulator.addScript(new ClassPathResource("schema.sql"));
            return databasePopulator;
        }
    
        private SimpleDriverDataSource createDataSource() {
            SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
            simpleDriverDataSource.setDriverClass(org.h2.Driver.class);
            simpleDriverDataSource.setUrl("jdbc:h2:target/database/example;AUTO_RECONNECT=TRUE");
            simpleDriverDataSource.setUsername("");
            simpleDriverDataSource.setPassword("");
            return simpleDriverDataSource;      
        }
    }
    
  3. ==============================

    3.EmbeddedDatabaseBuilder와 관련된 Spring 클래스를 살펴본 후에 DatabaseBuilder가 다음과 같은 코드를 사용하고 있음을 알게되었습니다.

    EmbeddedDatabaseBuilder와 관련된 Spring 클래스를 살펴본 후에 DatabaseBuilder가 다음과 같은 코드를 사용하고 있음을 알게되었습니다.

    ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    for (String sqlScript: sqlInitializationScripts ) {
      Resource sqlScriptResource = RESOURCE_LOADER.getResource(sqlScript);
      populator.addScript(sqlScriptResource);
    }
    DatabasePopulatorUtils.execute(populator, dataSource);
    

    Spring 구성이 아니라 @BeforeTest 메서드에있을지라도 이것은 잘 동작 할 것입니다.

  4. ==============================

    4.확실히 가능합니다.

    확실히 가능합니다.

    이미 Spring의 ApplicationContext에 의해로드되는 @Configuration 클래스를 가지고 있다면 이미 가지고있는 코드를 포함하는 새로운 @Bean 메소드를 생성하면됩니다 (물론 추가 return 문을 사용하면됩니다).

    EmbeddedDatabase는 DataSource 인터페이스를 구현하므로 JdbcTemplate에서 쉽게 사용할 수 있습니다.

    @Bean
    public DataSource db() {
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        builder.setType(H2).addScript("my-schema.sql").addScript("my-test-data.sql");
        return builder.build();
    }
    
  5. from https://stackoverflow.com/questions/16038360/initialize-database-without-xml-configuration-but-using-configuration by cc-by-sa and MIT license