원본 본문으로 이동하기

스프링 다중 DB 사용하기

박용서 - spring use multiple dbms 요즘 이것저것 작업하는게 많다보니... 오랜만에 글을 써보는 것 같네요.!! 여기에선 mysql, postgresql, hibernate, maven을 예제로 써보겠습니다. 1. pom.xml 설정 개인적으로 커넥터는 버전별 호환성 문제가 안되니.. 버전을 생략했습니다. (다만 글쓴시점으로 pg-sql 최신버전의 클래스로드가 안되는 버그로 9.4-1205-jdbc42 로 고정) 마지막 spring-boot-configuration-processor 는 설정을 위해 주입 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4-1205-jdbc42</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> 2. application.properties 설정 여기서는 아래와 같은 이름으로 설정해보겠습니다. conn_pgsql_test : postgresql conn_mysql_test : mysql url엔 개인취향을 반영한.. 설정이...라기보단.. 보통 저렇게 쓰죠;; spring.conn_mysql_test.driverClassName=com.mysql.jdbc.Driver spring.conn_mysql_test.url=jdbc:mysql://<호스트>:<포트>/<db명>?useSSL=true&useUnicode=yes&characterEncoding=utf-8 spring.conn_mysql_test.username=<계정> spring.conn_mysql_test.password=<암호> spring.conn_pgsql_test.driverClassName=org.postgresql.Driver spring.conn_pgsql_test.url=jdbc:postgresql://<호스트>:<포트>/<db명>?charSet=utf-8&prepareThreshold=1 spring.conn_pgsql_test.username=<계정> spring.conn_pgsql_test.password=<암호> 3. 연결 설정 파일은 하나로 만들어도 두개로 만들어도 상관은없지만, 개인적으로 두개가 더 깔끔해보여 2개를 생성하였습니다. 두개 이상의 데이터베이스 설정시 기본으로 사용될 Bean 에다가 @Primary 를 설정해줘야합니다. (필수사항) 대응할 도메인과 리포지토리의 패키지 위치를 적어줍니다. @Configuration @EnableJpaRepositories ( basePackages = "com.web.repository.pgsql", entityManagerFactoryRef = "pgsqlFactoryBean", transactionManagerRef = "pgsqlTransactionManager" ) public class JdbcPgsqlConfig { @Primary @Bean(name = "pgsqlDataSource") @ConfigurationProperties(prefix = "spring.conn_pgsql_test") public DataSource getDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "pgsqlFactoryBean") public LocalContainerEntityManagerFactoryBean getFactoryBean(EntityManagerFactoryBuilder builder) { return builder.dataSource(getDataSource()).packages("com.web.domain.pgsql").build(); } @Primary @Bean(name = "pgsqlTransactionManager") PlatformTransactionManager getTransactionManager(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(getFactoryBean(builder).getObject()); } } @Configuration @EnableJpaRepositories ( basePackages = "com.web.repository.mysql", entityManagerFactoryRef = "mysqlFactoryBean", transactionManagerRef = "mysqlTransactionManager" ) public class JdbcMysqlConfig { @Bean(name = "mysqlDataSource") @ConfigurationProperties(prefix = "spring.conn_mysql_test") public DataSource getDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "mysqlFactoryBean") public LocalContainerEntityManagerFactoryBean getFactoryBean(EntityManagerFactoryBuilder builder) { return builder.dataSource(getDataSource()).packages("com.web.domain.mysql").build(); } @Bean(name = "mysqlTransactionManager") PlatformTransactionManager getTransactionManager(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(getFactoryBean(builder).getObject()); } } 아래처럼 만들어주시면 알아서 주입됩니다.!! com.web.domain.mysql 패키지에는 mysql 엔티티 com.web.repository.mysql 패키지에는 mysql jpa리포지토리 (pgsql 생략) 적당한 데이터를 만들어서 테스트 해보시면 패키지 경로에 따라 서로다른 데이터소스에 주입되어 작동 할 겁니다.!! - 스프링 자바 Maven