회사에서 2개의 서로다른 DB에 접근해야 하는 업무가 생겨서 해당 내용을 기록하고자 한다.
하나의 서버에서 여러 DB에 접근할수 있게끔 서버 구조를 변경했다.
대략적인 순서는 아래와 같다.
패키지 구조나 파일명은 모두 다르기때문에 1번 사항은 스킵한다.
Mapper 인터페이스 파일과 쿼리를 작성하는 XML 구현체 부분을 데이터베이스 별로 나눠서 사용할 수 있게끔 패키지로 나누었다.
이러한 구조로 각각의 연결 정보를 작성한다.
Mybatis를 사용하려면 DataSource, SqlSessiontTemplate, SqlSessionFactory Bean 객체를 등록해야 한다.
다중 데이터 베이스를 사용하려면 데이터베이스마다 해당 작업을 진행해야 하는데, Spring의 Bean 관리 방법이 싱글톤을 사용하기 때문에 여러 DataSource 관련 Bean이 있으면 충돌난다..!
그렇기 때문에 특정 데이터베이스의 config 파일에 @Primaery 어노테이션을 붙여서 Bean을 생성해주고, 그 외에 데이터베이스 설정 파일에는 @Qualifier 어노테이션 같은 걸로 지칭을 해줘야 한다.
그래서 필자는 기존에 사용하던 DB 설정 파일에 Primary를 붙여서 사용하게끔 하고, 추가되는 DB 설정 파일에 @Qualifier 어노테이션을 붙여서 각각 설정했다.
@Primary를 붙인 설정파일
@Qualifier를 붙인 설정파일
@Configuration 어노테이션을 붙여서 Spring Framework가 기동시 등록할수 있게 한다.
@MapperScan 어노테이션을 사용해서 사용할 Mapper 인터페이스 경로를 지정하고, sqlSessionFactoryRef로 어떤 sqlSessionFactory를 사용할건지 지정한다 !! (중요 sqlSessionFactoryRef 를 지정하지 않으면 충돌나서 그런건지 BindingException 떨어진다.)
특정 DB 설정 파일에 @Primary 어노테이션을 붙여준다.
DataSource 메소드 작성
SqlSessionFactory 메소드 작성
SqlSessionTemplate 메소드 작성
위와 같이 설정 한 다음 Service 단에서 각각의 Mapper를 사용해서 DB에 접근하면 된다.