혼자 회사 프로젝트를 리빌드해보기 위해 프로젝트를 만들어 셋팅하다가 application에 mybatis설정을 할 수 있다는 것을 발견했다.
지금까지는 SqlSessionFactoryBean에 하드코딩으로 설정을 해주었는데 yml으로 관리할 수 있다니
너모 편리하자너..
그래서 가독성 좋고 관리하기 편한 yml의 설정을 사용하여 myBatis를 연동해보았다.
@Configuration
@EnableTransactionManagement
@MapperScan(value = "crm.aekyung.ak_crm_service.mapper", sqlSessionTemplateRef = "crmSessionTemplate")
@RequiredArgsConstructor
public class DataBaseConfig {
@Autowired
private final MybatisProperties mybatisProperties;
@Bean(name = "hikariCP")
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean(name = "crmDataSource")
public DataSource dataSource() {
DataSource dataSource = new HikariDataSource(hikariConfig());
return dataSource;
}
@Bean(name = "transactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("crmDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "crmSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("crmDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(mybatisProperties.getConfigLocation()));
sqlSessionFactoryBean.setMapperLocations(mybatisProperties.resolveMapperLocations());
return sqlSessionFactoryBean.getObject();
}
@Bean(name = "crmSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("crmSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
편하게 셋팅하려면 MybatisProperties.class를 사용하면 된다.
Application.class에
@EnableConfigurationProperties(MybatisProperties.class)
어노테이션을 사용하여 선언해주어야 한다고 하는 사람도 있는데, 빼도 잘 돌아가는거 보니까 없어도 되는듯.
맨 위에 MybatisProperties를 선언해준 후에 편하게 넣어주면 되는데, getConfigLocation() 메소드를 사용하면 에러가 난다. requireType이 Resource이나, returnType이 String이기 때문이다.
소스를 보면 MapperLocations의 경우, 내부에서 PathMatchingResourcePatternResolver를 사용하여 Resource배열을 return하는 메소드가 만들어져 있는데,
ConfigLocation은 String을 반환한다. 이왕 만드는 거 Resource를 반환하도록 만들어주지, 개열받는다.
(나보다 똑똑한 사람들이 만들었을테니, 뭔가 이유가 있겠지..)
그래서 PathMatchingResourcePatternResolver를 사용하여 별도로 처리해주었다.
정상 작동 확인.