다음은 스프링부트 + 마이바티스 프로젝트에 2개 이상의 데이터소스를 연결하는 예제이다.
기존 스프링 데이터베이스 연동이 되어있다고 가정 후 진행되며, 신규 데이터베이스는 구별이 쉽도록 new 데이터베이스로 명칭 한다.
1. 신규 데이터베이스 접속정보 추가
추가될 데이터베이스의 속성을 application.properties에 추가
#기존 DB Setting
spring.datasource.url={url}
spring.datasource.driverClassName={driverClassName}
spring.datasource.username={username}
spring.datasource.password={password}
spring.datasource.schema={schema}
#추가될 DB Setting
new.datasource.url={url}
new.datasource.driverClassName={driverClassName}
new.datasource.username={username}
new.datasource.password={password}
new.datasource.schema={schema}
2. 데이터베이스 연결 빈 속성 추가
기존 데이터베이스 연결 설정을 하는 DatabaseConfig.java 외에 NewDatabaseConfig.java신규로 추가한다.
기존 DatabaseConfig.java
@Bean(name="sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
- sessionFactory 설정 -
return sessionFactory.getObject();
}
@Bean(name="sqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
-- sessionTemplate 설정
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name="dataSource")
@Primary
public DataSource dataSource() {
- 데이터베이스 연결설정 -
return new DataSource();
}
신규 추가된 NewDatabaseConfig.java 설정
@Bean(name="newSqlSessionFactory")
public SqlSessionFactory newSqlSessionFactory(@Qualifier("newDataSource") DataSource newDataSource) throws Exception {
- SqlSessionFactory 설정 -
return newSessionFactory.getObject();
}
@Bean(name="newSqlSessionTemplate")
public SqlSessionTemplate newSqlSessionTemplate(@Qualifier("newSqlSessionFactory") SqlSessionFactory newSqlSessionFactory) throws Exception {
- SqlSessionTemplate 설정 -
return new SqlSessionTemplate(newSqlSessionFactory);
}
@Bean(name="newDataSource")
public DataSource newDataSource() {
- 데이터베이스 연결설정 -
return new DataSource();
}
다음 예제대로 SqlSessionFactory, SqlSessionTemplate, DataSource 빈만 별도로 등록해 주면 설정한 데이터베이스 주소로 연결이 가능하다.
다만, NewDatabaseConfig.java의 빈 설정을 보면
public SqlSessionTemplate newSqlSessionTemplate(@Qualifier("newSqlSessionFactory") SqlSessionFactory newSqlSessionFactory)
다음과 같이 최초 설정에도 SqlSessionTemplate, SqlSessionFactory 빈 등록 시 새로 생성된 SqlSessionFactory, DataSource를 명시해주지 않는다면 기존 설정의 @Primary 설정을 따라 기존사용 중인 데이터베이스 접속 정보를 사용하게 되기에 의존성 주입을 별도로 해주어야 한다. 별도로 명시하지 않을 경우, 최초 빈 등록시 신규 데이터베이스는 컨넥션만 맺은 채로, 신규 데이터베이스 연결 설정도 1번 데이터베이스 연결 설정 빈을 참조하게 된다.
3. 데이터소스 설정
추가 데이터베이스 연결 빈 설정이 완료되면 등록된 2개의 데이터 소스 중 접속정보를 선택하여 사용 가능하다.
private final SqlSessionTemplate sqlSessionTemplate;
private final SqlSessionTemplate newSqlSessionTemplate;
public TestRepository(@Qualifier("newSqlSessionTemplate") SqlSessionTemplate sqlSessionTemplate, SqlSessionTemplate sqlSessionTemplate) {
this.newSqlSessionTemplate = newSqlSessionTemplate;
this.sqlSessionTemplate = sqlSessionTemplate;
}
--기존 데이터베이스 연결
public Integer connectionTest() throws Exception {
log.info(newSqlSessionTemplate.getConnection().get~()); -- 접속 정보 확인
return newSqlSessionTemplate.selectOne("~.connectionTest");
}
--신규 데이터베이스 연결
public Integer connectionTest() throws Exception {
log.info(sqlSessionTemplate.getConnection().get~()); -- 접속 정보 확인
return sqlSessionTemplate.selectOne("~.connectionTest");
}
기존 사용중인 데이터베이스 연결 빈 설정값에 @Primary 지정을 해주면 기존에 사용 중이던 SqlSessionTemplate에 어떤 빈을 사용할지 명시하지 않아도 @Primary 지정된 빈 설정을 따라간다. 예제와 같이 newSqlSessionTemplate에 의존성 주입을 해주어야 하지만, sqlSessionTemplate는 디폴트 설정인 기존 데이터베이스 설정을 사용한다.
'Spring' 카테고리의 다른 글
[Spring] 단위 테스트, JUnit의 개념 및 단위 테스트 코드 작성 방법 (0) | 2023.11.14 |
---|---|
[Spring] 스프링 컨테이너(Spring container)의 개념 (1) | 2023.11.07 |
[Spring] IoC(제어의 역전) & DI(의존성 주입)의 개념 (0) | 2023.11.06 |
[Spring] 스프링 배치 ItemReader의 개념, (MybatisCursorItemReader, MybatisPagingItemReader 구현) (2) | 2023.10.19 |
[Spring] 스프링 트랜잭션의 개념 및 적용 (@Transactional 사용법) (0) | 2023.10.17 |