[Spring] 스프링부트 + Mybatis 데이터소스 여러개 연결 (스프링 다중 데이터베이스 연결)

다음은 스프링부트 + 마이바티스 프로젝트에 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는 디폴트 설정인 기존 데이터베이스 설정을 사용한다.