ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring - 다중 데이터베이스 설정하기 (MySQL 스키마별 분리)
    Spring/전자정부프레임워크 2024. 12. 23. 17:00
    반응형

    Spring 다중 데이터베이스 설정하기 (MySQL 스키마별 분리)

    Spring과 MyBatis를 이용해 다중 데이터베이스를 연결하고 스키마별로 Config 파일을 설정하는 방법에 대해 정리합니다. 이 글에서는 사용자가 자신의 환경에 맞게 커스터마이징할 수 있도록 {userpath}와 같은 경로를 사용하여 설명합니다.

     

     

    1. XML 설정 파일 (context-datasource.xml)

    다중 데이터베이스 연결을 위해 context-datasource.xml 파일에서 각 데이터베이스의 DataSource를 정의합니다.

    <?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">
        
        <!-- MySQL DataSource (test1 스키마) -->
        <bean id="mysqlDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/{test1_schema}" />
            <property name="username" value="{test1_username}" />
            <property name="password" value="{test1_password}" />
        </bean>
        
        <!-- MySQL DataSource (test2 스키마) -->
        <bean id="databaseDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/{test2_schema}" />
            <property name="username" value="{test2_username}" />
            <property name="password" value="{test2_password}" />
        </bean>
    </beans>

     

     


    2. 공통 Config (WebConfig)

    WebConfig는 SqlSessionFactory와 TransactionManager를 생성하는 공통 로직을 포함하고 있습니다. 이를 활용하여 각 데이터베이스의 Config 파일에서 공통 로직을 재사용합니다.

    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);
        }
    }

    설명:

    • createSqlSessionFactory: 데이터 소스와 매퍼 경로를 입력받아 MyBatis의 SqlSessionFactory를 생성합니다.
    • createTransactionManager: 데이터 소스를 기반으로 트랜잭션 매니저를 생성합니다.
    •  

    3. MySQL Config 파일 (스키마별로)

    3.1 Example 스키마 Config

    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}.test1", // test1 매퍼 위치
        sqlSessionFactoryRef = "mysqlSqlSessionFactory" // SqlSessionFactory 지정
    )
    public class MySQLConfig extends WebConfig {
    
        @Bean(name = "mysqlSqlSessionFactory")
        public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource) throws Exception {
            return createSqlSessionFactory(mysqlDataSource, "classpath:/{userpath}/mappers/mysql/test1/*.xml");
        }
    
        @Bean(name = "mysqlTransactionManager")
        public PlatformTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource mysqlDataSource) {
            return createTransactionManager(mysqlDataSource);
        }
    }

    3.2 Database 스키마 Config

    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}.database", // Database 매퍼 위치
        sqlSessionFactoryRef = "mysqlSqlSessionFactory2" // SqlSessionFactory 지정
    )
    public class ExampleConfig extends WebConfig {
    
        @Bean(name = "mysqlSqlSessionFactory2")
        public SqlSessionFactory mysqlSqlSessionFactory2(@Qualifier("databaseDataSource") DataSource mysqlDataSource) throws Exception {
            return createSqlSessionFactory(mysqlDataSource, "classpath:/{userpath}/test2/*.xml");
        }
    
        @Bean(name = "mysqlTransactionManager")
        public PlatformTransactionManager mysqlTransactionManager(@Qualifier("databaseDataSource") DataSource mysqlDataSource) {
            return createTransactionManager(mysqlDataSource);
        }
    }

     

     

     

    정리

    1. XML 파일로 DataSource 정의: 데이터베이스 연결 정보를 XML로 관리.
    2. Config 파일로 각 데이터베이스 설정: SqlSessionFactory와 TransactionManager를 구성.
    3. MapperScan으로 매퍼 지정: 특정 패키지의 매퍼 파일과 데이터 소스를 연결.

    위 설정을 활용하면 프로젝트에서 다중 데이터베이스를 효율적으로 관리할 수 있습니다. 티스토리에 게시 시, {userpath}, {test1_schema} 등의 값을 자신의 환경에 맞게 수정하도록 안내하면 됩니다.

    반응형

    댓글

Designed by Tistory.