Spirng 3.1.1 + MyBatis + jQuery로 웹 사이트를 구현하고 있다.
그런데 현재 시스템에서 서로 다른 2개의 DB를 사용을 하고 있는 상태이다.
물론 한쪽 DB로 접속해서 소유권을 명시적으로 기술해서 타 DB의 테이블에 대한 작업을 진행할 수 있지만
일단 datasource 2개를 별도로 만들기로 했다. 다만 Spring 설정은 pure java 설정으로 진행했다.
방법을 찾기 위해 구글과 네이버를 통해 검색을 해보았지만 springboot에 대해서는 pure 자바 설정에 대한 자료가 많은 반면
Spring에 대해서는 아직까지도 대부분의 설정이 xml 파일을 이용해서 이루어지고 있었다.
게다가 springboot는 JPA + Hibernate밖에 보이질 않아서 MyBatis 설정은 찾기가 힘들었다.
물론 내가 Spring의 원리에 통달해있다면 xml 설정으로부터 java 설정을 이끌어낼 수 잇었겠지만…ㅠ.ㅠ
결국 springboot 설정을 설명해놓은 블로그를 참조로하여 설정을 마칠 수 있었다.
Spring + MyBatis 사용 시 java 설정을 이용하여 datasource 2개 사용하기
1. 먼저 config.java를 어떻게 구성하느냐는 개인의 취향일 수 있을 것 같다.
나는 각각의 datasource에 해당하는 설정 java를 별도로 만들었다. 편의성 DSConfigFirst.java와 DSConfigSecond.java라고 하자.
2. 각각의 설정 java 파일에 필요한 annotation과 @Bean을 구현한다. 다음 3가지 메소드를 구현했다.
dataSource() : DataSource 리턴
transactionManager : DataSourceTransactionManager 리턴
sqlSessionFactory() : SqlSessionFactory 리턴
여기까지 했을 때 빌드 시 다음 오류가 발생하였다.
No unique bean of type [org.apache.ibatis.session.SqlSessionFactory] is defined:…
No unique bean of type [org.springframework.transaction.PlatformTransactionManager] is defined:…
각각 SqlSessionFactory와 PlatformTransactionManager가 2개 이상 존재한다는 의미였고 이 것은 2개의 설정이 존재하다보니 이 설정들을 가져다 사용하는 mapper와 service에서 둘 중 어떤 것을 사용할지 몰라 발생하는 오류였던 것이다.
그렇다면 해결책은 mapper와 service에서 각각 자신이 가져다 사용할 설정을 구분할 수 있도록 해주면 되는 것이다.
1. SqlSessionDactory 구분
각각의 설정 java 파일의 @MapperScan annotation에 sqlSessionFactoryRef 속성을 주고 그 값으로 각각 다른 이름을 지정해준다.
...
@Configuration
@MapperScan
(basePackages = "com.dbfirst.mapper",
sqlSessionFactoryRef =
"dbFirstSqlSessionFactory"
)
class DSConfigFirst {
...
}
...
@Configuration
@MapperScan
(basePackages = "com.dbsecond.mapper",
sqlSessionFactoryRef =
"dbSecondSqlSessionFactory"
)
class DSConfigSecond {
...
}
2. PlatformTransactionManager 구분
transactionManager() 메소드의 @Bean annotation에 name 속성을 통해 각각 별도의 이름을 설정해 주고 Service(ServiceImpl)의
@Transactional annotation에 value 속성으로 @Bean의 name에 설정한 이름을 지정해준다.
...
@Configuration
@MapperScan
(basePackages = "com.dbfirst.mapper",
sqlSessionFactoryRef =
"dbFirstSqlSessionFactory"
)
class DSConfigFirst {
...
@Bean(name="dbFirstTX")
public
PlatformTransactionManager transactionManager(
) {
...
}
...
@Configuration
@MapperScan
(basePackages = "com.dbsecond.mapper",
sqlSessionFactoryRef =
"dbSecondSqlSessionFactory"
)
class DSConfigSecond {
...
@Bean(name="dbSecondTX")
public
PlatformTransactionManager transactionManager(
) {
...
}
일단 여기까지 하니 정상적으로 2개의 datasource를 이용할 수 있게 되었다.
'Development > Web' 카테고리의 다른 글
[AngularJS] $scope 상속에 대해 유의할 점 (0) | 2015.08.12 |
---|---|
[HTML5] Canvas에 라인 그리기 (0) | 2013.08.23 |
[옛 글] 자바스크립트로 서버와 클라이언트 통신을? - nowjs (0) | 2013.07.19 |
[옛 글] new jQeue 시스템 개발을 위해 작성할 문서 목록 (0) | 2013.07.05 |