코린이
article thumbnail

프로젝트를 하는데 서버를 두 개 받을 수 없어서 한 프로젝트에 2개의 DB를 연결하게 됐다.


application.properties

datasource.test1.url=jdbc:mysql://localhost:3306/test1
datasource.test1.username=root
datasource.test1.password=1234
datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver

datasource.test2.url=jdbc:mysql://localhost:3306/test2
datasource.test2.username=root
datasource.test2.password=1234
datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver

 datasource.test1.username 원래는 이 부분이 spring.datasource.username 이었지만 데이터베이스가 2개라는 것을 구분지어주기 위해 이름을 나눠줘야 한다.

 


MultipleDataSourceCinfiguration.java

> 만들어야하는 java 클래스 <

@Configuration
public class MultipleDataSourceCinfiguration {

    @Bean
    @Primary
    @Qualifier("primaryHikariConfig")
    @ConfigurationProperties(prefix="datasource.test1")
    public HikariConfig primaryHikariConfig() {
        return new HikariConfig();
    }

    @Bean
    @Primary
    @Qualifier("primaryDataSource")
    public DataSource primaryDataSource() throws Exception {
        return new HikariDataSource(primaryHikariConfig());
    }
    @Bean
    @Qualifier("secondaryHikariConfig")
    @ConfigurationProperties(prefix="datasource.test2")
    public HikariConfig secondaryHikariConfig() {
        return new HikariConfig();
    }

    @Bean
    @Qualifier("secondaryDataSource")
    public DataSource secondaryDataSource() throws Exception {
        return new HikariDataSource(secondaryHikariConfig());
    }
}

 @primary 어노테이션을 사용해 어떤 데이터베이스가 우선이 될지 정해줘야 한다. 그렇지 않으면 어떤 db에 가서 찾아야할지 몰라서 오류 냄

  @ConfigurationProperties(prefix="datasource.test1") : properties 파일 전위에 붙은 내용을 토대로 db를 찾아간다.

■  @Qualifier("primaryHikariConfig") : 이 bean객체를 사용할 때 괄호 안의 이름으로 사용할 수 있도록 함.

 


test1Configuration.java

> 역시 만들어야 함 <

@Configuration
@MapperScan(value = "com.매퍼경로.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class test1Configuration {
    @Primary
    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(
            @Qualifier("primaryDataSource") DataSource dataSource, ApplicationContext applicationContext) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);

        org.apache.ibatis.session.Configuration myBatisConfig = new org.apache.ibatis.session.Configuration();
        myBatisConfig.setMapUnderscoreToCamelCase(true);  // 카멜케이스 설정

        sqlSessionFactoryBean.setConfiguration(myBatisConfig);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.wizware.test1;");
        sqlSessionFactoryBean.setMapperLocations
        				(applicationContext.getResources("classpath:mapper/test1mapper/*.xml")); // 매퍼위치

        return sqlSessionFactoryBean.getObject();
    }

    @Primary
    @Bean(name = "primarySqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

org.apache.ibatis.session.Configuration myBatisConfig = new org.apache.ibatis.session.Configuration();
myBatisConfig.setMapUnderscoreToCamelCase(true);  // 여기서 설정

sqlSessionFactoryBean.setConfiguration(myBatisConfig);

원래 db를 한 개만 쓰면 application.properties에서 설정해주면 되지만, config를 만들게되면서 설정을 따로 해줘야함. 저게 빠지면 스네이크-카멜케이스 호환이 안될수도 있다. 

 


test2Configuration.java

> 역시 만들어야 함 <

@Configuration@MapperScan(value = "com.매퍼경로.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class test2Configuration {
    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(
            @Qualifier("secondaryDataSource") DataSource dataSource, ApplicationContext applicationContext) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        
        org.apache.ibatis.session.Configuration myBatisConfig = new org.apache.ibatis.session.Configuration();
        myBatisConfig.setMapUnderscoreToCamelCase(true);  // 카멜케이스 설정

        sqlSessionFactoryBean.setConfiguration(myBatisConfig);

        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.wizware.test2;");
        sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/test2Mapper/*.xml"));

        return sqlSessionFactoryBean.getObject();
    }

    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

 


 

이렇게 하고 늘 하던대로 mapper.xml작성 -> repository등록 -> service  작성, repository  객체 생성 -> 실행 하게 되면

db가 연결된다!

연결되면 이렇게 뜸

반응형
profile

코린이

@코인아님

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!