
다중 데이터베이스 설정은 설정 정보를 모두 입력하여 Config 파일을 직접 생성해준다고 생각하면 된다.
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}
두 개의 JPA 설정이 충돌이 있을 수 있으므로 패키지로 구분하자.
주요 설정
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());
}
}
주요 설정
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()));
}
}