-
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); } }
정리
- XML 파일로 DataSource 정의: 데이터베이스 연결 정보를 XML로 관리.
- Config 파일로 각 데이터베이스 설정: SqlSessionFactory와 TransactionManager를 구성.
- MapperScan으로 매퍼 지정: 특정 패키지의 매퍼 파일과 데이터 소스를 연결.
위 설정을 활용하면 프로젝트에서 다중 데이터베이스를 효율적으로 관리할 수 있습니다. 티스토리에 게시 시, {userpath}, {test1_schema} 등의 값을 자신의 환경에 맞게 수정하도록 안내하면 됩니다.
반응형'Spring > 전자정부프레임워크' 카테고리의 다른 글
Spring - Oracle 스키마별로 분리하여 연결하기 (0) 2024.12.27 Spring - Oracle 데이터베이스 연결 (0) 2024.12.27 Spring - 다중 DB 연결하기 (0) 2024.12.23 Spring - 데이터베이스 연결 시 Config파일 파헤치기 (0) 2024.12.23 Spring - Config파일을 통하여 DB연결 및 흐름도 (0) 2024.12.23