-
[설정]Spring boot 2 Database 여러개 설정하는 방법Spring/Spring Boot 2019. 1. 28. 17:19반응형
최근에 Spring boot 2.0.1 을 쓰면서 기존에 Spring framework만 쓰던 나에게 아주 제대로 삽질을 시킨 일이 생겼다 .
기존 회사 시스템이 총 2가지 이상의 데이터베이스에 접속하는 구성으로 되있었고 대부분의 spring이 그렇듯 xml 로 설정 되있었다.
Spring boot 을 쓰기로 맘먹은바!! 가즈아 !!
Java Config 를 사용 해보기로 했고 , 자바개발자들이라면 그렇듯 구글링을 해가며 한땀한딴 복붙(?) maven 의 격렬한 저항(?) 과 함께 설정을 하고 프로젝트 세팅 완료
디비 접속을 해보자 !! 그러나 ... 하나만 붙는다... 뒤에 붙어야 할 녀석이... 붙질 않고 에러만 내뱉는다 .... 무슨 일이지
@Configuration
@MapperScan(value="Mapper 경로", sqlSessionFactoryRef="statSessionFactory")
public class StatDataSourceConfig {
@Autowired
private Environment env;
@Autowired
private ApplicationContext applicationContext;
@Bean(name="statDataSource")
@Primary
public DataSource dataSource() {
String url = env.getProperty("spring.stat.datasource.url");
String username = env.getProperty("spring.stat.datasource.username");
String password = env.getProperty("spring.stat.datasource.password");
int poolsize = Integer.parseInt(env.getProperty("spring.stat.datasource.hikari.maximum-pool-size"));
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(env.getProperty("spring.stat.datasource.driver-class-name"));
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setMaximumPoolSize( poolsize );
/**
* 옵션이 더 필요할경우 아래 기능 사용
*/
// dataSource.setIdleTimeout(4000);
// dataSource.setMaxLifetime(100000);
// dataSource.setConnectionTestQuery(env.getProperty("spring.stat.datasource.hikari.connection-test-query"));
// dataSource.setConnectionInitSql(env.getProperty("spring.stat.datasource.hikari.connection-test-query"));
// dataSource.setValidationTimeout(5000);
dataSource.setPoolName("STAT_POOL");
return dataSource;
}
@Bean(name="statTransactionManager")
@Primary
public PlatformTransactionManager transactionManager(@Qualifier("statDataSource") DataSource dataSource ) {
//return new DataSourceTransactionManager(dataSource());
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
transactionManager.setGlobalRollbackOnParticipationFailure(false);
return transactionManager;
}
@Bean(name="statSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("statDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setTypeAliasesPackage("com.lebi.sbmanager.mapper.stat");
sessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
sessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/stat/*.xml"));
return sessionFactoryBean.getObject();
}
@Bean(name = "statSqlSessionTemplate")
public SqlSessionTemplate statSqlSessionTemplate(SqlSessionFactory statSqlSessionFactory) throws Exception {
return new SqlSessionTemplate(statSqlSessionFactory);
}
}확인 결론부터 말하면 @Primary 가 중요하다... 이녀석이 였다 ... 보통 위에 소스처럼 java config 를 설정 하고 spring boot 가 낯선(?) 사람은 아무생각없이 실행을 해볼것이다. 그렇다면 100% 안될것이다.
이유는 @Primary 이 키워드가 어떤 설정을 메인으로 할지 선언해주는 어노테이션이다. 다른말로 하자만 @Primary 가 선언된 설정은 이 프로젝트에서 기준!!! 설정인것이다.
왜 이런식으로 기존 Spring framework 에서 변경 되었는지는 모르겠지만 ( 나중에 찾아봐야겠다 ) 하나의 메인 데이터베이스 연결과 다수의 서브 연결 방식으로 구현이 가능하다
서브 연결을 추가하고싶다면 위의 소스에서 @Primary 만 제거하고 각 이름들과 설정 값들만 바꿔주고 java class 파일을 추가하면 복수로 추가가 가능하다 ( 서버하나가 10개 이상 붙을 일은 없겠지 ! 라고 생각했는데 회사다니다보니 필요한 경우도 있었다... 물론 내가아닌 다른사람이지만 )
난 xml 을 격하게 싫어 한다. 왜냐면 싫기 때문이다. 그래서 앞으로는 왠만하면 java config 를 애용해 볼생각이다 ( 이젠 spring framework 도 안녕~ 사요나라 ~ )
뭔가 설정하지 않아도 알아서 해줄거 같은 spring boot 였는데 제약(?) 이 있는 부분도 있어서 좀더 신경써서 다루어줘야 겠다는 생각이 든다.
반응형'Spring > Spring Boot' 카테고리의 다른 글
Spring boot vs Spring Framework (1) 2019.08.07 Logback - 특정 이름별로 로그 분리 하기 (0) 2019.06.26 Spring Cloud (0) 2019.03.25 [설정] Spring boot 2 Logback 설정 (0) 2019.01.30 [설정] Spring boot 2 Yml 설정하기 (0) 2019.01.28