카테고리 없음

Mybatis 다중 DB 연결 방법 (main, sub)

cornarong 2024. 7. 4. 18:01

기존 설정되어있는 SE 데이터베이스 외에 추가로 FC 데이터베이스 연결이 필요한 상황에서 사용한 방법입니다.

 

각 설정파일 내 어노테이션이나 메소드 등 기능들과 흐름에 대한 설명들은 제외했습니다.

일반적이지 않은 상황이라 차후에 저도 참고만 하기위해 단순 사용방법만 작성했습니다.

참고만 해주세요.

나머지는 정보가 많이 있으니 검색해보시기 바랍니다.


* 사용 및 구분 명칭

기존 사용중인 Database : Se / 신규 추가된 Database : Fc


1. properties 또는 yml 설정 

* 주의 : 프리픽스(prefix) 설정란에 데이터베이스 주소를 "url" 로 사용중이라면 "jdbc-url"로 변경

# SE DB
spring.datasource.se.jdbc-url=jdbc:log4jdbc:postgresql://{SE_ADDRESS}:{SE_PORT}/{SE_DATABASENAME}?sslmode=require
spring.datasource.se.username={SE_NAME}
spring.datasource.se.password={SE_PASSWORD}
spring.datasource.se.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

# FC DB
spring.datasource.fc.jdbc-url=jdbc:log4jdbc:postgresql://{FC_ADDRESS}:{FC_PORT}/{FC_DATABASENAME}?sslmode=require
spring.datasource.fc.username={FC_NAME}
spring.datasource.fc.password={FC_PASSWORD}
spring.datasource.fc.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

 


 

* 사용할 DB에 따라 디렉토리, 파일을 정확히 나누어놓고 config 설정만 잘 해놓으면 끝.

2. 기본 디렉토리 및 파일 설정

* Se와 Fc 디렉토리를 나누어 디렉토리에 따라 각각 다른 데이터베이스를 사용하도록 설정합니다.

 

java config 추가

  • java/{프로젝트명}/config/SeDatabaseConfig .java 파일 추가
  • java/{프로젝트명}/config/FcDatabaseConfig.java 파일 추가

java mppper interface 디렉토리 추가

  • java/{프로젝트명}/mapper/se 디렉토리 추가
  • java/{프로젝트명}/mapper/fc 디렉토리 추가

resources mapper xml 디렉토리 추가

  • resources/mapper/se디렉토리 추가
  • resources/mapper/fc 디렉토리 추가

resources config 추가

  • resources/mybatis 디렉토리 추가
  • resources/mybatis/ mybatis-config.xml 파일 추가

SeDatabaseConfig.java

* @Primary 어노테이션으로 해당 데이터베이스가 메인이되는 Database라고 선언해줍니다.

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "{프로젝트명}.mapper.se", sqlSessionFactoryRef = "seSqlSessionFactory", sqlSessionTemplateRef = "seSqlSession")
public class SeDatabaseConfig {

    @Primary
    @Bean(name = "seDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.se")
    public DataSource seDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "seSqlSessionFactory")
    public SqlSessionFactory seSqlSessionFactory(@Qualifier("seDataSource") DataSource seDataSource, ApplicationContext applicationContext) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(seDataSource);
        sessionFactory.setConfigLocation(applicationContext.getResource("classpath:mybatis/mybatis-config.xml"));
        sessionFactory.setVfs(SpringBootVFS.class);
        sessionFactory.setMapperLocations(applicationContext.getResources("classpath:mapper/se/*.xml"));
        return sessionFactory.getObject();
    }

    @Primary
    @Bean(name = "seSqlSession")
    public SqlSessionTemplate seSqlSession(@Qualifier("seSqlSessionFactory") SqlSessionFactory seSqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(seSqlSessionFactory);
    }

    @Primary
    @Bean(name = "seTransactionManager")
    public DataSourceTransactionManager seTransactionManager(@Qualifier("seDataSource") DataSource seDataSource) {
        return new DataSourceTransactionManager(seDataSource);
    }
}

 

FcDatabaseConfig.java 

* SeDatabaseConfig.java 의 @Primary 어노테이션만 제거하고, 경로만 Fc로 맞춰줍니다.

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "{프로젝트명}.mapper.fc", sqlSessionFactoryRef = "fcSqlSessionFactory", sqlSessionTemplateRef = "fcSqlSession")
public class FcDatabaseConfig {

    @Bean(name = "fcDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.fc")
    public DataSource fcDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "fcSqlSessionFactory")
    public SqlSessionFactory fcSqlSessionFactory(@Qualifier("fcDataSource") DataSource fcDataSource, ApplicationContext applicationContext) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(fcDataSource);
        sessionFactory.setConfigLocation(applicationContext.getResource("classpath:mybatis/mybatis-config.xml"));
        sessionFactory.setVfs(SpringBootVFS.class);
        sessionFactory.setMapperLocations(applicationContext.getResources("classpath:mapper/fc/*.xml"));
        return sessionFactory.getObject();
    }

    @Bean(name = "fcSqlSession")
    public SqlSessionTemplate fcSqlSession(@Qualifier("fcSqlSessionFactory") SqlSessionFactory fcSqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(fcSqlSessionFactory);
    }

    @Bean(name = "fcTransactionManager")
    public DataSourceTransactionManager fcTransactionManager(@Qualifier("fcDataSource") DataSource fcDataSource) {
        return new DataSourceTransactionManager(fcDataSource);
    }
}

mybatis-config.xml

* 옵션에 따라 그대로 사용하시면 됩니다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 캐시 활성화 여부 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- null 값에 대해 setter를 호출할지 여부 -->
        <setting name="callSettersOnNulls" value="rue"/>        
        <!-- 지연 로딩 비활성화 -->
        <setting name="lazyLoadingEnabled" value="false"/>        
        <!-- 적극적인 지연 로딩 활성화 -->
        <setting name="aggressiveLazyLoading" value="true"/>        
        <!-- 다중 결과 집합 활성화 -->
        <setting name="multipleResultSetsEnabled" value="true"/>        
        <!-- 컬럼 레이블 사용 여부 -->
        <setting name="useColumnLabel" value="true"/>        
        <!-- 생성된 키 사용 여부 -->
        <setting name="useGeneratedKeys" value="false"/>        
        <!-- 자동 매핑 동작 설정 -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>        
        <!-- 기본 실행기 타입 설정 -->
        <setting name="defaultExecutorType" value="REUSE" />        
        <!-- 기본 문장 타임아웃(ms) 설정 -->
        <setting name="defaultStatementTimeout" value="25000" />        
        <!-- null에 대한 JDBC 유형 설정 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
    <typeAliases>
        <typeAlias alias="hashMap" type="java.util.HashMap" />
        <typeAlias alias="String" type="java.lang.String"/>
    </typeAliases>
    <mappers>
    </mappers>
</configuration>

 


위 설정을 통해 Se와 Fc 데이터베이스를 구분하여 각각의 설정과 연결을 하고

이후로는 위에서 나누어놓은 디렉토리(SE, FC)에 따라 기존 방식대로 mybatis를 사용하면 됩니다.

 

Se mapper에 설정한 메소드, 쿼리는 SeDatabase를 바라보고 사용하고 

Fc mapper에 설정한 메소드, 쿼리는 FcDatabase를 바라보고 사용하게 됩니다.