/**
 * JPA + MyBatis
 */
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.hikari")
@EnableJpaRepositories(
        entityManagerFactoryRef = "jpa" + "EntityManagerFactory",
        transactionManagerRef = "jpa" + "TransactionManager",
        basePackages = "com.ezserver.domain"
)
@MapperScan(basePackages = "com.ezserver.domain")
public class DataSourceConfig extends HikariConfig {

    @Bean
    @Primary
    public DataSource dataSource() {
        return new LazyConnectionDataSourceProxy(new HikariDataSource(this));
    }

    @Bean(name = "jpa" + "EntityManagerFactory")
    @Primary
    public EntityManagerFactory entityManagerFactory(@Autowired DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(dataSource);
        factory.setPackagesToScan("com.ezserver.domain");
        setConfigureEntityManagerFactory(factory);

        return factory.getObject();
    }

    @Bean(name = "jpa" + "TransactionManager")
    @Primary
    public PlatformTransactionManager transactionManager(@Qualifier("jpa" + "EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);

        return transactionManager;
    }

    @Bean
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Autowired DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setVfs(SpringBootVFS.class);
        factoryBean.setConfiguration(this.getMybatisConfig());

        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath*:mybatis/*.xml"));

        return factoryBean.getObject();
    }

    @Bean
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Autowired SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    private void setConfigureEntityManagerFactory(LocalContainerEntityManagerFactoryBean factory) {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        factory.setJpaVendorAdapter(vendorAdapter);

        Map<String, String> jpaPropertyMap = new HashMap<>();
        jpaPropertyMap.put("hibernate.hbm2ddl.auto", "create");
        jpaPropertyMap.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        jpaPropertyMap.put("hibernate.show_sql", "true");
        jpaPropertyMap.put("hibernate.format_sql", "true");
        factory.setJpaPropertyMap(jpaPropertyMap);

        factory.afterPropertiesSet();
    }

    private org.apache.ibatis.session.Configuration getMybatisConfig() {
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setCacheEnabled(true);
        configuration.setLazyLoadingEnabled(false);
        configuration.setAggressiveLazyLoading(false);
        configuration.setMultipleResultSetsEnabled(true);
        configuration.setUseColumnLabel(true);
        configuration.setAutoMappingBehavior(AutoMappingBehavior.PARTIAL);
        configuration.setDefaultExecutorType(ExecutorType.SIMPLE);
        configuration.setDefaultStatementTimeout(25000);
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setJdbcTypeForNull(JdbcType.NVARCHAR);
        configuration.setLazyLoadTriggerMethods(new HashSet<>(Arrays.asList("equals", "clone", "hashCode", "toString")));
        configuration.setLogPrefix("[SQL]");

        return configuration;
    }

}

참조


[Spring] 다중 데이터소스 설정(Multiple Datasource JPA, Mybatis)