반응형

mybatis spring boot starter 를 이용하고 있습니다.

    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>


보통은 application.properites 에서 아래와 같이 설정해서 사용하고 있습니다.

mybatis.config-location=classpath:config/mybatis-config.xml


config/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- <properties resource="config/jdbc.properties" /> -->
  <settings>
    <setting name="cacheEnabled" value="true" />
    <setting name="useGeneratedKeys" value="true" />
    <setting name="defaultExecutorType" value="REUSE" />
    <setting name="defaultStatementTimeout" value="3000" />
  </settings>
  <typeAliases>
    <package name="goni9071.plugin.member.entity" />
    <package name="goni9071.core.entity" />
  </typeAliases>
  <mappers>
    <mapper resource="core/sql/a.xml" />
    <mapper resource="core/sql/b.xml" />
    <mapper resource="core/sql/c.xml" />
    <mapper resource="plugin/member/sql/d.xml" />
    <mapper resource="plugin/member/sql/e.xml" />
    <mapper resource="plugin/member/sql/f.xml" />
  </mappers>
 
</configuration>


개발을 하다보면 프로젝트를 여러개로 나누어서 해야하는 경우도 있습니다.

그리고 쿼리들도 서로 의존성 없이 나누어져서 사용해야할 수도 있습니다.

multiple datasource 이야기는 아닙니다.


one datasource 에서 독릭접으로 프로젝트를 구성하고 mybatis도 따로 구성하고 싶은 이야기입니다.

하지만 one datasource 에서 Connection pool을 별도로 사용하고 싶지는 않습니다.


One Datasource + One Connection Pool + Multiple Configuration 이 정도 인것 같습니다.


아무리 찾아봐도 mybatis-config.xml 을 여러개로 나누어서 사용하는 방법은 없는 것 같았습니다.


하지만 mybatis-config.xml 을 Java Config로 변경하고 Java Config를 여러개로 나누는 것은 가능했습니다.



application.properties

mybatis.configuration.cache-enabled=true
mybatis.configuration.use-generated-keys=true
mybatis.configuration.default-executor-type=reuse
mybatis.configuration.default-statement-timeout=3000



Core 프로젝트

 
import java.io.InputStream;
 
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.executor.ErrorContext;
import org.apache.ibatis.io.Resources;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class CorerMybatisConfig {
  private static Logger logger = LoggerFactory.getLogger(CorerMybatisConfig.class);
 
  @Bean
  ConfigurationCustomizer coreMybatisConfigurationCustomizer() {
    return new ConfigurationCustomizer() {
      @Override
      public void customize(org.apache.ibatis.session.Configuration configuration) {
        try {
          configuration.getTypeAliasRegistry().registerAliases("goni9071.core.entity");
          String[] mapperResources = { "core/sql/a.xml""core/sql/b.xml""core/sql/c.xml" };
          for (String resource : mapperResources) {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
            ErrorContext.instance().resource(resource);
            mapperParser.parse();
          }
        } catch (Exception e) {
          logger.error("Mybatis Loading Error", e);
        }
      }
 
    };
  }
}


Plugin Member 프로젝트

 
import java.io.InputStream;
 
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.executor.ErrorContext;
import org.apache.ibatis.io.Resources;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class PluginMemberMybatisConfig {
  private static Logger logger = LoggerFactory.getLogger(CorerMybatisConfig.class);
 
  @Bean
  ConfigurationCustomizer coreMybatisConfigurationCustomizer() {
    return new ConfigurationCustomizer() {
      @Override
      public void customize(org.apache.ibatis.session.Configuration configuration) {
        try {
          configuration.getTypeAliasRegistry().registerAliases("goni9071.plugin.member.entity");
          String[] mapperResources = { "plugin/member/sql/d.xml""plugin/member/sql/e.xml""plugin/member/sql/f.xml" };
          for (String resource : mapperResources) {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
            ErrorContext.instance().resource(resource);
            mapperParser.parse();
          }
        } catch (Exception e) {
          logger.error("Mybatis Loading Error", e);
        }
      }
 
    };
  }
}



주의할점은 아래 코드에서 보이는 것 처럼 ConfigurationCustomizer 가 실행되려면 application.properites 에 mybatis.configuration 가 하나 이상있어야 합니다. 그리고 mybatis.config-location 가 있어도 안됩니다.


org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

...
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setVfs(SpringBootVFS.class);
    if (StringUtils.hasText(this.properties.getConfigLocation())) {
      factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
    }
    Configuration configuration = this.properties.getConfiguration();
    if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
      configuration = new Configuration();
    }
    if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
      for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
        customizer.customize(configuration);
      }
    }
...


반응형

+ Recent posts