어느순간 SpringFramework을 사용하는 프로젝트는 springboot가 대세가 되버렸고,
이제는 점점 springboot + maven + mybatis 에서 maven자리를 gradle이 대체하는 추세인듯하다. (개인적인 느낌)
여전히 Maven이 친숙한 입장에서 gradle이 익숙하지 않은데서 오는 삽질이 또다시 반복되고 있다.(ㅠ.ㅠ)
(앞으로도 개발을 놓기전까지 이런 패턴은 계속될듯...)
eclipse나 sts등의 IDE에서 gradle로 관리하는 프로젝트에서 mybatis mapper.xml 에서 domain class의 typealias를 인식하지 못하고 오류표시를 내곤한다.
그런데 springboot로 실행하면 특별한 오류없이 잘 실행되곤 한다. 그냥 내버려두고 싶다가도 계속 눈에 거슬리다보니 원인과 해결책을 찾아 메모해둔다.
개인의견으로는 Spring의 설정이 xml 에서 annotation으로 변화되면서 실행시점에 mapper와 domain class를 인식하기에 실행에는 문제가 없으나 IDE Tool에서는 이를 인지하기엔 추가적인 설정이 필요하지만 적용하지 않아 발생하는 오류로 보인다.
기본적인 springboot+mybatis+gradle 프로젝트 설정 이후 DataSource관련 추가설정을 별도의 class로 분리하여 아래와 같이 설정했다.
1. 일반적인 springboot 설정
@SpringBootApplication
public class TestBootApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(TestBootApplication.class);
app.run(args);
}
2. DataSource Config설정
@Configuration
@ComponentScan
@EnableTransactionManagement
public class DataSourceConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setVfs(SpringBootVFS.class);
Properties properties = new Properties();
properties.setProperty("callSettersOnNulls", "true");
sessionFactory.setConfigurationProperties(properties);
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setCallSettersOnNulls(true);
sessionFactory.setConfiguration(configuration);
sessionFactory.setTypeAliasesPackage("com.test.dto");
return sessionFactory.getObject();
}
}
여기까지만 해도 실행에는 문제가 발생하지 않는다. 하지만 서두의 문제처럼 IDE에서 오류가 발생한다.
application.properties나 application.yml에 아래의 설정을 추가해주자.
@WebListener
public class InitialCustomListener implements ServletContextListener {
...
}
SpringBoot 적용방법
Type I.
@Component annotation을 적용하여 등록한 Bean class 에 ApplicationListener interface구현
@Component
public class CustomListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
//... Biz Logic
}
}
Type II.
SpringBootApplication 에 직접 Listener 등록
@SpringBootApplication
@ComponentScan(basePackages = "com.test")
public class MyApplication {
public static void main(String[] args) {
SpringApplication sap = new SpringApplication(MyApplication.class);
//Listener 추가
sap.addListeners(new CustomListener());
sap.addListeners(...);
//Initializer 추가
sap.addInitializers(...);
sap.run(args);
}
}
II. 외부 properties 를 적용하는 방법
개발된 jar 를 전달하여 적용하고자 할때 해당 DB 나 service port 등을 구동시 반영하고자 할때 application.properties 를 외부로 빼서 이를 start 시 적용하기 위한 방법
@SpringBootApplication
@MapperScan(basePackages = "com.test.mapper") //MyBatis Mapper Scan추가
public class MyApplication {
public static void main(String[] args) {
... 이하 생략
2. Mapper xml 에서 Return 시 컬럼값을 CamelCase로 자동변환하여 조회하는 설정
mybatis.configuration.map-underscore-to-camel-case=true
# mybatis 매핑 type을 짧게 쓰기 위한 설정
mybatis.type-aliases-package=com.test.dto