Programing/Spring

Spring Mybatis 멀티 database 연동 다중, 복수 데이터베이스 연동 oracle, mysql

리커니 2019. 3. 20.
반응형

Spring Mybatis 멀티 database 연동 다중, 복수 데이터베이스 연동 oracle, mysql

 

Spring Mybatis의 Mapper interface를 사용하는 환경에서

복수의 database 설정을 하는 방법을 알아보겠습니다.

 

ibatis 환경에서 복수의 database 설정 방법은 아래의 Link를 참고하세요.

 

Link : 전자정부프레임워크 egov ibatis 복수의 디비 커넥션 설정 방법

 

 

저의 경우 Oracle과 MySql 커넥션 설정을 하겠습니다.

MySql의 경우 별도의 커넥터를 의존 성 주입 해주셔야 합니다.

pom.xml 에 커넥터 dependency를 추가 합니다.

 

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>

 

이제 복수 DB의 datasource 설정을 해줍니다. (datasource.xml)

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">
    
    <!-- global properties setting -->
    <bean id="egov.propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:/globals.properties</value>
            </list>
        </property>
    </bean>
    
<!--     oracle -->
    <bean id="dataSourceOracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}" />
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>
    
<!--     mySQL -->
    <bean id="dataSourceMysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${mysql.driver}"/>
        <property name="url" value="${mysql.url}"/>
        <property name="username" value="${mysql.username}"/>
        <property name="password" value="${mysql.password}"/>
    </bean>
    
</beans>

 

Mybatis 설정 쪽에서는 위에서 설정된 2개의 datasource를 활용하여,

mapper의 xml 위치와 interface의 위치를 구분하여, 2개의 연결 세션이 구분되도록 설정하여 줍니다. (mapper.xml)

여기서 중요한 점은 두 database의 매퍼가 있는 클래스는 구분을 해주셔야 합니다.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSourceOracle" />
        <property name="configLocation" value="classpath:/sqlmap/sql-mapper-config.xml" />
        <property name="mapperLocations" value="classpath:/sqlmap/oracle/mappers/**/*.xml" />
    </bean>
     <bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
        <property name="basePackage" value="Oracle 매퍼interface가 있는 풀 페키지명" />
        <property name="sqlSessionFactoryBeanName" value="sqlSession"/>
    </bean>

    <bean id="sqlSessionMysql" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSourceMysql" />
        <property name="configLocation" value="classpath:/sqlmap/sql-mapper-config.xml" />
        <property name="mapperLocations" value="classpath:/sqlmap/mysql/mappers/*.xml" />
    </bean>    
    <bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
        <property name="basePackage" value="MySQL 매퍼interface가 있는 풀 페키지명" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionMysql"/>
    </bean>
</beans>

 

sqlSession과 mapperConfigurer 가 한 세트입니다.

sql-mapper-config.xml은 두개다 같은 설정을 사용하고, interface와 매핑된 xml을 구분하여,

각각 sql 세션에 활용될 수 있도록 세팅된 것 입니다.

 

 

Annotation을 활용한 커넥션 구분

 

위에 설명한 방식처럼 클래스를 구분하여 두는 방법 외에도 어노테이션을 활용하여 구분할 수 있습니다.

기본 Mapper annotation은 Oracle, MySqlMapper annotation은 MySql 로 설정하는 방법을 알아보겠습니다.

 

MySql annotation을 추가합니다.

 

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Component;

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MySqlMapper {
    String value() default "";
}

 

그리고 mapper.xml 파일을 수정해 줍니다.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:/sqlmap/sql-mapper-config.xml" />
        <property name="mapperLocations" value="classpath:/sqlmap/oracle/mappers/**/*.xml" />
    </bean>
    
    <bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
        <property name="basePackage" value="패키지명" />
        <property name="sqlSessionFactoryBeanName" value="sqlSession"/>
    </bean>    
    
    <bean id="sqlSessionMysql" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSourceMysql" />
        <property name="configLocation" value="classpath:/sqlmap/sql-mapper-config.xml" />
        <property name="mapperLocations" value="classpath:/sqlmap/mysql/mappers/*.xml" />
    </bean>
    
     <bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
        <property name="basePackage" value="패키지명" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionMysql"/>
        <property name="annotationClass" value="위에서 생성한 MySqlMapper 경로"/>
    </bean>    
</beans>

 

위에서 설명한 방식과 차이점은 MySQL 쪽 annotationClass 프로퍼티 추가 입니다.

sqlSession 쪽도 구분없이 하나로 갈 수 있지만, 추 후에 해깔릴 수도 있을 것 같아 구분을 해 두었습니다.

 

이렇게 설정을 하게 되면 @Mapper 를 사용한 interface는 Oracle로

@MySqlMapper 를 사용한 interface는 MySql 로 접속 하게 됩니다.

반응형

댓글

💲 추천 글