다중 DB를 사용하기 위해서 DB마다 DataSource를 설정하기 위한 Config를 작성한다.
그 Config 중 가장 기본적으로 사용될 DBConfig에서 @Primary를 사용해야하는데, 만약 어느 Config에서도 해당 어노테이션을 사용하지 않으면, Spring에서 어떤걸 사용할지 몰라 발생하는 에러.
에러 메세지는 아래와 같다.
'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' that could not be found.
해결 방법은 간단하다. 내가 사용한 Config 클래스 중 어느 하나라도 클래스의 각 메서드에 @Primary 어노테이션을 작성하면 된다.
필자 같은 경우는 회사에서 DB2 데이터베이스를 메인으로 사용하기에 아래와 같이 Db2Config.java 클래스를 작성하였다.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.josunhotel.catchTable.repository.db2", // DB2 관련 엔티티의 Repository 패키지
entityManagerFactoryRef = "db2EntityManagerFactory",
transactionManagerRef = "db2TransactionManager"
)
public class DB2Config {
@Primary
@Bean(name = "db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "db2EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("db2DataSource") DataSource dataSource) {
Map<String, Object> jpaProperties = new HashMap<>();
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.DB2400Dialect"); // dialect 설정
jpaProperties.put("hibernate.format_sql", "true"); // 쿼리 prettier
jpaProperties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"); // 필드 <-> 컬럼 매핑 시 네이밍 전략 설정
return builder
.dataSource(dataSource)
.packages("com.josunhotel.catchTable.domain.db2") // DB2 관련 엔티티 패키지
.persistenceUnit("db2PU")
.properties(jpaProperties)
.build();
}
@Primary
@Bean(name = "db2TransactionManager")
public PlatformTransactionManager db2TransactionManager(
@Qualifier("db2EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}