카테고리 없음

Spring 다중 DB 연결

뽀글뽀글 개발자 2024. 7. 16. 10:37

 프로젝트를 진행하다 보면 여러 개의 데이터베이스를 연결할 일이 생긴다.

예를 들어 MSA 환경에서 분산 DB를 사용하는 경우 하나의 micro service에서 여러 DB에 접근할 필요가 있을 수 있다.

이런 경우 micro service 간의 통신을 통해 필요한 데이터를 API로 받아올 수 있는데, 이 경우에는 각 micro service의 역할이 더 명확해지긴 하지만, 성능 측면에서는 DB에 직접 접근하는 것 보다 훨씬 느리다는 단점이 있다.

 

 

DB 설정 방법

yml 설정

spring:
  datasource:
    first-db:
      jdbc-url: ${DB_URL_1}
      driver-class-name: org.postgresql.Driver
      username: ****
      password: ****
    second-db:
      jdbc-url: ${DB_URL_2}
      driver-class-name: org.postgresql.Driver
      username: ****
      password: ****

 

 

DB Config 생성

FirstDBConfig

아래 예시는 2개의 DB를 연결했기 때문에 @Primary를 사용했고, 3개부터는 @Qulifier를 사용하면 된다.

@EnableJpaRepositories(
        basePackages = "{firstDB 관련 repository가 존재하는 패키지 경로}",
        entityManagerFactoryRef = "firstEntityManagerFactory",
        transactionManagerRef = "firstTransactionManager"
)
@Configuration      
public class FirstDBConfig {
    
    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(firstDataSource());
        em.setPackagesToScan("{firstDB 관련 entity가 존재하는 패키지 경로}");
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        return em;
    }

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.first")	//yml datatsource 경로
    public DataSource firstDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager firstTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(firstEntityManagerFactory().getObject());
        return transactionManager;
    }
}

 

SecondDBConfig

@EnableJpaRepositories(
        basePackages = "{secondDB 관련 repository가 존재하는 패키지 경로}",
        entityManagerFactoryRef = "secondEntityManagerFactory",
        transactionManagerRef = "secondTransactionManager"
)
@Configuration      
public class FirstDBConfig {
    
    @Bean
    public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(secondDataSource());
        em.setPackagesToScan("{secondDB 관련 entity가 존재하는 패키지 경로}");
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        return em;
    }


    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.second")	//yml datatsource 경로
    public DataSource secondDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    public PlatformTransactionManager secondTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(secondEntityManagerFactory().getObject());
        return transactionManager;
    }
}

 

 

JPA 관련 설정을 추가하고 싶다면, JPA와 Hibernate 간 Adapter인 HibernateJpaVenderAdapter의 setter를 찾아보면 된다.