ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [설정]Spring boot 2 Database 여러개 설정하는 방법
    Spring/Spring Boot 2019. 1. 28. 17:19
    반응형

    최근에 Spring boot 2.0.1 을 쓰면서 기존에 Spring framework만 쓰던 나에게 아주 제대로 삽질을 시킨 일이 생겼다 .


    기존 회사 시스템이 총 2가지 이상의 데이터베이스에 접속하는 구성으로 되있었고 대부분의 spring이 그렇듯 xml 로 설정 되있었다. 


    Spring boot 을 쓰기로 맘먹은바!!  가즈아 !! 


    Java Config 를 사용 해보기로 했고 , 자바개발자들이라면 그렇듯 구글링을 해가며 한땀한딴 복붙(?) maven 의 격렬한 저항(?) 과 함께 설정을 하고 프로젝트 세팅 완료 


    디비 접속을 해보자 !! 그러나 ... 하나만 붙는다... 뒤에 붙어야 할 녀석이... 붙질 않고 에러만 내뱉는다 .... 무슨 일이지 



    @Configuration
    @MapperScan(value="Mapper 경로", sqlSessionFactoryRef="statSessionFactory")
    public class StatDataSourceConfig {

    @Autowired
    private Environment env;
    @Autowired
    private ApplicationContext applicationContext;

    @Bean(name="statDataSource")
    @Primary
    public DataSource dataSource() {
    String url = env.getProperty("spring.stat.datasource.url");
    String username = env.getProperty("spring.stat.datasource.username");
    String password = env.getProperty("spring.stat.datasource.password");

    int poolsize = Integer.parseInt(env.getProperty("spring.stat.datasource.hikari.maximum-pool-size"));
    HikariDataSource dataSource = new HikariDataSource();
    dataSource.setDriverClassName(env.getProperty("spring.stat.datasource.driver-class-name"));
    dataSource.setJdbcUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setMaximumPoolSize( poolsize );
    /**
    * 옵션이 더 필요할경우 아래 기능 사용
    */
    // dataSource.setIdleTimeout(4000);
    // dataSource.setMaxLifetime(100000);
    // dataSource.setConnectionTestQuery(env.getProperty("spring.stat.datasource.hikari.connection-test-query"));
    // dataSource.setConnectionInitSql(env.getProperty("spring.stat.datasource.hikari.connection-test-query"));
    // dataSource.setValidationTimeout(5000);
    dataSource.setPoolName("STAT_POOL");

    return dataSource;
    }


    @Bean(name="statTransactionManager")
    @Primary
    public PlatformTransactionManager transactionManager(@Qualifier("statDataSource") DataSource dataSource ) {

    //return new DataSourceTransactionManager(dataSource());
    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
    transactionManager.setGlobalRollbackOnParticipationFailure(false);
    return transactionManager;
    }

    @Bean(name="statSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("statDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setTypeAliasesPackage("com.lebi.sbmanager.mapper.stat");
    sessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
    sessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/stat/*.xml"));
    return sessionFactoryBean.getObject();
    }

    @Bean(name = "statSqlSessionTemplate")

    public SqlSessionTemplate statSqlSessionTemplate(SqlSessionFactory statSqlSessionFactory) throws Exception {
    return new SqlSessionTemplate(statSqlSessionFactory);

    }

    }

    확인 결론부터 말하면 @Primary 가 중요하다... 이녀석이 였다 ... 보통 위에 소스처럼 java config 를 설정 하고 spring boot 가 낯선(?) 사람은 아무생각없이 실행을 해볼것이다.  그렇다면 100% 안될것이다. 


    이유는 @Primary 이 키워드가 어떤 설정을 메인으로 할지 선언해주는 어노테이션이다. 다른말로 하자만 @Primary 가 선언된 설정은 이 프로젝트에서 기준!!! 설정인것이다. 


    왜 이런식으로 기존 Spring framework 에서 변경 되었는지는 모르겠지만 ( 나중에 찾아봐야겠다 ) 하나의 메인 데이터베이스 연결과 다수의 서브 연결 방식으로 구현이 가능하다 


    서브 연결을 추가하고싶다면 위의 소스에서 @Primary 만 제거하고 각 이름들과 설정 값들만 바꿔주고 java class 파일을 추가하면 복수로 추가가 가능하다 ( 서버하나가 10개 이상 붙을 일은 없겠지 ! 라고 생각했는데 회사다니다보니 필요한 경우도 있었다... 물론 내가아닌 다른사람이지만 ) 


    난 xml 을 격하게 싫어 한다. 왜냐면 싫기 때문이다. 그래서 앞으로는 왠만하면 java config 를 애용해 볼생각이다 ( 이젠 spring framework 도 안녕~ 사요나라 ~ ) 


    뭔가 설정하지 않아도 알아서 해줄거 같은 spring boot 였는데 제약(?) 이 있는 부분도 있어서 좀더 신경써서 다루어줘야 겠다는 생각이 든다. 

    반응형

    'Spring > Spring Boot' 카테고리의 다른 글

    Spring boot vs Spring Framework  (1) 2019.08.07
    Logback - 특정 이름별로 로그 분리 하기  (0) 2019.06.26
    Spring Cloud  (0) 2019.03.25
    [설정] Spring boot 2 Logback 설정  (0) 2019.01.30
    [설정] Spring boot 2 Yml 설정하기  (0) 2019.01.28
Designed by Tistory.