프로젝트를 하는데 서버를 두 개 받을 수 없어서 한 프로젝트에 2개의 DB를 연결하게 됐다.
application.properties
datasource.test1.url=jdbc:mysql://localhost:3306/test1
datasource.test1.username=root
datasource.test1.password=1234
datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver
datasource.test2.url=jdbc:mysql://localhost:3306/test2
datasource.test2.username=root
datasource.test2.password=1234
datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver
■ datasource.test1.username 원래는 이 부분이 spring.datasource.username 이었지만 데이터베이스가 2개라는 것을 구분지어주기 위해 이름을 나눠줘야 한다.
MultipleDataSourceCinfiguration.java
> 만들어야하는 java 클래스 <
@Configuration
public class MultipleDataSourceCinfiguration {
@Bean
@Primary
@Qualifier("primaryHikariConfig")
@ConfigurationProperties(prefix="datasource.test1")
public HikariConfig primaryHikariConfig() {
return new HikariConfig();
}
@Bean
@Primary
@Qualifier("primaryDataSource")
public DataSource primaryDataSource() throws Exception {
return new HikariDataSource(primaryHikariConfig());
}
@Bean
@Qualifier("secondaryHikariConfig")
@ConfigurationProperties(prefix="datasource.test2")
public HikariConfig secondaryHikariConfig() {
return new HikariConfig();
}
@Bean
@Qualifier("secondaryDataSource")
public DataSource secondaryDataSource() throws Exception {
return new HikariDataSource(secondaryHikariConfig());
}
}
■ @primary 어노테이션을 사용해 어떤 데이터베이스가 우선이 될지 정해줘야 한다. 그렇지 않으면 어떤 db에 가서 찾아야할지 몰라서 오류 냄
■ @ConfigurationProperties(prefix="datasource.test1") : properties 파일 전위에 붙은 내용을 토대로 db를 찾아간다.
■ @Qualifier("primaryHikariConfig") : 이 bean객체를 사용할 때 괄호 안의 이름으로 사용할 수 있도록 함.
test1Configuration.java
> 역시 만들어야 함 <
@Configuration
@MapperScan(value = "com.매퍼경로.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class test1Configuration {
@Primary
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(
@Qualifier("primaryDataSource") DataSource dataSource, ApplicationContext applicationContext) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
org.apache.ibatis.session.Configuration myBatisConfig = new org.apache.ibatis.session.Configuration();
myBatisConfig.setMapUnderscoreToCamelCase(true); // 카멜케이스 설정
sqlSessionFactoryBean.setConfiguration(myBatisConfig);
sqlSessionFactoryBean.setTypeAliasesPackage("com.wizware.test1;");
sqlSessionFactoryBean.setMapperLocations
(applicationContext.getResources("classpath:mapper/test1mapper/*.xml")); // 매퍼위치
return sqlSessionFactoryBean.getObject();
}
@Primary
@Bean(name = "primarySqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
org.apache.ibatis.session.Configuration myBatisConfig = new org.apache.ibatis.session.Configuration();
myBatisConfig.setMapUnderscoreToCamelCase(true); // 여기서 설정
sqlSessionFactoryBean.setConfiguration(myBatisConfig);
원래 db를 한 개만 쓰면 application.properties에서 설정해주면 되지만, config를 만들게되면서 설정을 따로 해줘야함. 저게 빠지면 스네이크-카멜케이스 호환이 안될수도 있다.
test2Configuration.java
> 역시 만들어야 함 <
@Configuration@MapperScan(value = "com.매퍼경로.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class test2Configuration {
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(
@Qualifier("secondaryDataSource") DataSource dataSource, ApplicationContext applicationContext) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration myBatisConfig = new org.apache.ibatis.session.Configuration();
myBatisConfig.setMapUnderscoreToCamelCase(true); // 카멜케이스 설정
sqlSessionFactoryBean.setConfiguration(myBatisConfig);
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.wizware.test2;");
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/test2Mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean(name = "secondarySqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
이렇게 하고 늘 하던대로 mapper.xml작성 -> repository등록 -> service 작성, repository 객체 생성 -> 실행 하게 되면
db가 연결된다!
연결되면 이렇게 뜸