스프링부터 다중 데이터소스 설정 방법은 간단하다. 먼저 application.properties 파일에 "구분.datasource"로 시작하는 데이터소스 설정을 추가한다. 다음은 예이다.
# datasource 1
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@10.xx.xx.xx:SID
spring.datasource.username=dbuser
spring.datasource.password=dbpw
spring.datasource.tomcat.initialSize=5
spring.datasource.tomcat.maxActive=40
spring.datasource.tomcat.maxIdle=40
spring.datasource.tomcat.minIdle=5
spring.datasource.tomcat.maxWait=5
spring.datasource.tomcat.validationQuery=select 1+1 from dual
spring.datasource.tomcat.testWhileIdle=true
spring.datasource.tomcat.timeBetweenEvictionRunsMillis=60000
# datasource 2
sms.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
sms.datasource.url=jdbc:sqlserver://10.xx.xx.xx:1433;databaseName=SMS
sms.datasource.username=dbuser1
sms.datasource.password=dbpw1
sms.datasource.tomcat.initialSize=1
sms.datasource.tomcat.maxActive=20
sms.datasource.tomcat.maxIdle=20
sms.datasource.tomcat.minIdle=1
sms.datasource.tomcat.maxWait=1
sms.datasource.tomcat.validationQuery=select 1
sms.datasource.tomcat.testWhileIdle=true
sms.datasource.tomcat.timeBetweenEvictionRunsMillis=60000
이 코드는 spring.datasource로 시작하는 데이터소스와 sms.datasource로 시작하는 데이터소스를 설정했다. "구분.datasource.tomcat"으로 시작하는 설정은 톰캣 DBCP 설정이다.
스프링부트는 별도 설정을 하지 않으면 spring.datasource로 시작하는 설정만 데이터소스로 사용하므로, 다중 데이터소스를 사용하려면 별도 설정을 추가해야 한다. 다음은 다중 데이터소스를 위한 자바 설정 예이다.
@Configuration
public class DataSourceConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSourceProperties dataSourceProp() {
return new DataSourceProperties();
}
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource.tomcat")
@Qualifier("primary")
public DataSource dataSource() {
return dataSourceProp().initializeDataSourceBuilder().build();
}
@Primary
@Bean(name = "transactionManager")
@Qualifier("primary")
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
@ConfigurationProperties(prefix = "sms.datasource")
public DataSourceProperties smsDataSourceProp() {
return new DataSourceProperties();
}
@Bean(name = "smsDataSource")
@ConfigurationProperties(prefix = "sms.datasource.tomcat")
@Qualifier("sms")
public DataSource smsDataSource() {
return smsDataSourceProp().initializeDataSourceBuilder().build();
}
@Bean(name = "smsTransactionManager")
@Qualifier("sms")
public PlatformTransactionManager smsTransactionManager() {
return new DataSourceTransactionManager(smsDataSource());
}
각 데이터소스 설정별로 세 개의 빈을 설정했다.
- 설정 프로퍼티를 담은 DataSourceProperties 빈
- @ConfigurationProperties를 사용해서 접두어를 지정(예, smsDataSourceProp() 빈 설정은 @ConfigurationProperties의 prefix 값으로 sms.datasource 사용)
- DataSourceProperties 빈을 이용해서 DataSource 빈 생성
- DataSourceProperties의 initializeDataSourceBuilder() 메서드를 이용해서 생성해야 tomcat 설정이 적용
- 각 DataSource 마다 트랜잭션관리자 생성
- 글로벌 트랜잭션을 사용해야 하면 JTA 트랜잭션 설정