Spring Boot 다중 데이터페이스 연결(JPA 설정)

노성웅·2025년 5월 14일
post-thumbnail

다중 데이터베이스 설정

다중 데이터베이스 설정은 설정 정보를 모두 입력하여 Config 파일을 직접 생성해준다고 생각하면 된다.

1. yml 파일 설정

  • 설정하려는 데이터베이스 정보들을 이름(ex maridb, tiberodb)을 주어 datasource 내용을 입력해준다.
spring: 
	datasource:  
	  mariadb:  
	    jdbc-url: jdbc:mariadb://{mariadb_ip}:{mariadb_port}/{mariadb_schema}  
	    driver-class-name: org.mariadb.jdbc.Driver  
	    username: {maridb_name}  
	    password: {mariadb_password}  
	  tiberodb:  
	    jdbc-url: jdbc:mariadb://{tiberodb_ip}:{tiberodb_port}/{tiberodb_schema}  
	    driver-class-name: org.mariadb.jdbc.Driver  
	    username: {tiberodb_name}  
	    password: {tiberodb_password}

2. Config 파일 설정

두 개의 JPA 설정이 충돌이 있을 수 있으므로 패키지로 구분하자.

MariaDBConfig

주요 설정

  • basePackages: JPARepository 파일이 읽을 Repository의 경로를 맞춰주는게 중요하다.

  • packages: JPA Entity 파일이 읽을 Entity의 경로를 맞춰주는게 중요하다.

  • persist : 트랜잭션 매니저를 구분하기 위한 구분값.

    @Configuration  
    @EnableJpaRepositories(  
           basePackages = "test.domain",  //Repository 파일 스캔 경로 
           entityManagerFactoryRef = "mariaEntityManagerFactory",  
           transactionManagerRef = "mariaTransactionManager"  
    )  
    public class MariaDBConfig {  
     
       @Primary  //기본 DB 설정에는 Primary를 반드시 작성해준다. 
       @Bean(name = "mariaDataSource")  
       @ConfigurationProperties(prefix = "spring.datasource.mariadb")  
       public DataSource mariaDataSource() {  
           return DataSourceBuilder.create().build();  
       }  
     
       @Primary  
       @Bean(name = "mariaEntityManagerFactory")  
       public LocalContainerEntityManagerFactoryBean mariaEntityManagerFactory(  
               EntityManagerFactoryBuilder builder,  
               @Qualifier("mariaDataSource") DataSource dataSource) {  
           return builder  
                   .dataSource(dataSource)  
                   .packages("test.domain")  //Entity 파일 스캔 경로 
                   .persistenceUnit("maria")  //EntityManager마다 각 트랜잭션을 만들기 위해 필요한 Unit ID값, ID마다 고유한 트랜잭션을 보장하기 위해 필요하다. 
                   .build();  
       }  
     
       @Primary  
       @Bean(name = "mariaTransactionManager")  
       public PlatformTransactionManager mariaTransactionManager(  
               @Qualifier("mariaEntityManagerFactory") LocalContainerEntityManagerFactoryBean mariaEntityManagerFactory  
       ) {  
           return new JpaTransactionManager(mariaEntityManagerFactory.getObject());  
       }  
    }

TiberoDBConfig

주요 설정

  • mariaDB 설정과 거의 동일.
  • Tibero는 Oracle 문법이라 JPA 방언 설정을 추가로 해줘야 한다.
    - properties.dialect : 방언 설정
    - properties.hdm2ddl.auto : 스키마 자동 설정
    @Configuration  
    @EnableJpaRepositories(  
           basePackages = "test.external",  
           entityManagerFactoryRef = "tiberoEntityManagerFactory",  
           transactionManagerRef = "tiberoTransactionManager"  
    )  
    public class TiberoDBConfig {  
     
       @Bean(name = "tiberoDataSource")  
       @ConfigurationProperties(prefix = "spring.datasource.tiberodb")  
       public DataSource tiberoDataSource() {  
           return DataSourceBuilder.create().build();  
       }  
     
       @Bean(name = "tiberoEntityManagerFactory")  
       public LocalContainerEntityManagerFactoryBean tiberoEntityManagerFactory(  
               EntityManagerFactoryBuilder builder,  
               @Qualifier("tiberoDataSource") DataSource dataSource) {  
     
           // JPA 설정  
           Map<String, String> properties = new HashMap<>();  
           properties.put("hibernate.dialect", "org.hibernate.dialect.OracleDialect");  
           properties.put("hibernate.hbm2ddl.auto", "none");  
     
           return builder  
                   .dataSource(dataSource)  
                   .packages("test.external")  
                   .persistenceUnit("tiberodb")  
                   .properties(properties)  
                   .build();  
       }  
     
       @Bean(name = "tiberoTransactionManager")  
       public PlatformTransactionManager tiberoTransactionManager(  
               @Qualifier("tiberoEntityManagerFactory") LocalContainerEntityManagerFactoryBean tiberoEntityManagerFactory  
       ) {  
           return new JpaTransactionManager(Objects.requireNonNull(tiberoEntityManagerFactory.getObject()));  
       }  
     
     

}



0개의 댓글