카테고리 없음
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를 찾아보면 된다.