ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring - 다중 DB 연결하기
    Spring/전자정부프레임워크 2024. 12. 23. 15:52
    반응형
    import javax.sql.DataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.ImportResource;
    import org.springframework.transaction.PlatformTransactionManager;
    
    @Configuration
    @ImportResource("classpath:/egovframework/spring/context-datasource.xml") // XML 파일 로드
    @MapperScan(
        basePackages = "{userpath}", // Oracle 매퍼 경로
        sqlSessionFactoryRef = "oracleSqlSessionFactory"
    )
    public class OracleConfig extends WebConfig {
    
        @Bean(name = "oracleSqlSessionFactory")
        public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource oracleDataSource) throws Exception {
            return createSqlSessionFactory(oracleDataSource, "classpath:/{userpath}/*.xml");
        }
    
        @Bean(name = "oracleTransactionManager")
        public PlatformTransactionManager oracleTransactionManager(@Qualifier("oracleDataSource") DataSource oracleDataSource) {
            return createTransactionManager(oracleDataSource);
        }
    }

    Oracle 연결 설정

    (1) context-datasource.xml 수정

    Oracle에 대한 데이터소스를 정의합니다.

    <?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">
    	
    	<!-- Oracle DataSource -->
     	<bean id="oracleDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    	    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    	    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
    	    <property name="username" value="oracle_user"/>
    	    <property name="password" value="oracle_password"/>
    	</bean>
    </beans>

    (2) OracleConfig.java

    Oracle DB를 위한 Config 클래스입니다. MapperScan을 통해 매퍼 위치를 지정하고, oracleDataSource를 기반으로 SqlSessionFactory와 트랜잭션 매니저를 생성합니다.

    import javax.sql.DataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.ImportResource;
    import org.springframework.transaction.PlatformTransactionManager;
    
    @Configuration
    @ImportResource("classpath:/egovframework/spring/context-datasource.xml") // XML 파일 로드
    @MapperScan(
        basePackages = "{userpath}", // Oracle 매퍼 경로
        sqlSessionFactoryRef = "oracleSqlSessionFactory"
    )
    public class OracleConfig extends WebConfig {
    
        @Bean(name = "oracleSqlSessionFactory")
        public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource oracleDataSource) throws Exception {
            return createSqlSessionFactory(oracleDataSource, "classpath:/{userpath}/*.xml");
        }
    
        @Bean(name = "oracleTransactionManager")
        public PlatformTransactionManager oracleTransactionManager(@Qualifier("oracleDataSource") DataSource oracleDataSource) {
            return createTransactionManager(oracleDataSource);
        }
    }

     MariaDB 연결 설정

    (1) context-datasource.xml 수정

    MariaDB에 대한 데이터소스를 정의합니다

    <?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">
    
    	<!-- MariaDB DataSource -->
    	<bean id="mariaDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        	<property name="driverClassName" value="org.mariadb.jdbc.Driver"/>
        	<property name="url" value="jdbc:mariadb://localhost:3307/test"/>
        	<property name="username" value="maria_user"/>
        	<property name="password" value="maria_password"/>
    	</bean>
    </beans>

    (2) MariaConfig.java

    MariaDB를 위한 Config 클래스입니다. MapperScan을 통해 매퍼 위치를 지정하고, mariaDataSource를 기반으로 SqlSessionFactory와 트랜잭션 매니저를 생성합니다.

    import javax.sql.DataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.ImportResource;
    import org.springframework.transaction.PlatformTransactionManager;
    
    @Configuration
    @ImportResource("classpath:/egovframework/spring/context-datasource.xml") // XML 파일 로드
    @MapperScan(
        basePackages = "{mapperpath}", // Oracle 매퍼 경로
        sqlSessionFactoryRef = "oracleSqlSessionFactory"
    )
    public class OracleConfig extends WebConfig {
    
        @Bean(name = "oracleSqlSessionFactory")
        public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource oracleDataSource) throws Exception {
            return createSqlSessionFactory(oracleDataSource, "classpath:/{userpath}/*.xml");
        }
    
        @Bean(name = "oracleTransactionManager")
        public PlatformTransactionManager oracleTransactionManager(@Qualifier("oracleDataSource") DataSource oracleDataSource) {
            return createTransactionManager(oracleDataSource);
        }
    }

     


    공통 로직(WebConfig.java)

    Oracle과 MariaDB 모두에서 공통적으로 사용하는 SqlSessionFactory와 트랜잭션 매니저 생성 로직은 WebConfig 클래스에서 관리합니다.

    import javax.sql.DataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    
    @Configuration
    public class WebConfig {
    
        // 공통 SqlSessionFactory 생성 로직
        public SqlSessionFactory createSqlSessionFactory(DataSource dataSource, String mapperLocation) throws Exception {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            sqlSessionFactoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(mapperLocation)
            );
            return sqlSessionFactoryBean.getObject();
        }
    
        // 공통 트랜잭션 매니저 생성 로직
        public PlatformTransactionManager createTransactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    }

     


    동작 원리

    1. context-datasource.xml: 데이터베이스 연결 설정을 정의하고 DataSource 빈을 생성합니다.
    2. Config 클래스: 각 DB에 맞는 SqlSessionFactory와 트랜잭션 매니저를 생성하며, 매퍼 스캔 위치를 설정합니다.
    3. WebConfig: 공통적으로 사용하는 SqlSessionFactory와 트랜잭션 매니저 생성 로직을 제공합니다.
    4. MyBatis 매퍼: MapperScan 어노테이션으로 지정된 패키지 경로에서 매퍼 파일을 스캔하여 SQL을 실행합니다.
    반응형

    댓글

Designed by Tistory.