[Mybatis] 동적 데이터소스(Dynamic DataSources) 예제

동적 데이터소스(Dynamic DataSources)를 사용하여 다중 데이터베이스 연결을 지원하려면 Spring 프레임워크와 함께 MyBatis를 사용하는 것이 일반적입니다. 아래는 Spring과 MyBatis를 함께 사용하여 동적 데이터소스를 구현하는 예제입니다.

예제: 동적 데이터소스 구현

  1. Spring과 MyBatis 설정:

    먼저 Spring과 MyBatis를 설정합니다. Spring 프레임워크에서 데이터소스 빈을 동적으로 생성할 수 있는 @Configuration을 사용한 Java 설정 파일을 생성합니다.

@Configuration
@MapperScan(basePackages = "com.example.mappers", sqlSessionFactoryRef = "sqlSessionFactory")
public class DatabaseConfig {

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

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

    @Primary
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(
            @Qualifier("dataSource1") DataSource dataSource1,
            @Qualifier("dataSource2") DataSource dataSource2) throws Exception {

        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dynamicDataSource(dataSource1, dataSource2));
        return sessionFactoryBean.getObject();
    }

    @Primary
    @Bean(name = "transactionManager")
    public DataSourceTransactionManager transactionManager(
            @Qualifier("dataSource1") DataSource dataSource1,
            @Qualifier("dataSource2") DataSource dataSource2) {

        return new DataSourceTransactionManager(dynamicDataSource(dataSource1, dataSource2));
    }

    @Bean(name = "dynamicDataSource")
    public DataSource dynamicDataSource(
            @Qualifier("dataSource1") DataSource dataSource1,
            @Qualifier("dataSource2") DataSource dataSource2) {

        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("db1", dataSource1);
        targetDataSources.put("db2", dataSource2);

        DynamicRoutingDataSource dynamicDataSource = new DynamicRoutingDataSource();
        dynamicDataSource.setTargetDataSources(targetDataSources);
        dynamicDataSource.setDefaultTargetDataSource(dataSource1);

        return dynamicDataSource;
    }
}` 
  1. 매퍼 인터페이스 작성:

    매퍼 인터페이스를 작성하고 SQL 쿼리를 작성합니다.

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users")
    List<User> getAllUsers();
}` 
  1. 프로퍼티 파일 설정:

    application.properties 파일에 데이터베이스 연결 정보를 설정합니다.

spring.datasource.db1.url=jdbc:mysql://localhost:3306/database1
spring.datasource.db1.username=username1
spring.datasource.db1.password=password1

spring.datasource.db2.url=jdbc:mysql://localhost:3306/database2
spring.datasource.db2.username=username2
spring.datasource.db2.password=password2` 
  1. Java 코드에서 사용:

    동적 데이터소스를 사용하여 데이터베이스에 연결합니다.

public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(DatabaseConfig.class);
        UserMapper userMapper = context.getBean(UserMapper.class);

        // 동적 데이터소스를 통해 데이터베이스 작업 수행
        List<User> users = userMapper.getAllUsers();

        for (User user : users) {
            System.out.println("User: " + user);
        }
    }
}` 

위의 예제에서는 Spring과 MyBatis를 사용하여 동적 데이터소스를 설정하고 다중 데이터베이스에 연결하는 방법을 보여줍니다. DatabaseConfig 클래스에서 @Configuration을 사용하여 동적 데이터소스를 구성하고, application.properties 파일에서 데이터베이스 연결 정보를 설정합니다. Java 코드에서는 Spring의 ApplicationContext를 사용하여 동적 데이터소스를 주입하고 데이터베이스 작업을 수행합니다.

이 예제는 Spring과 MyBatis를 함께 사용하여 동적 데이터소스를 설정하는 일반적인 방법을 보여줍니다. 데이터베이스의 연결 정보와 데이터베이스 수는 필요에 따라 조정할 수 있습니다.