반응형
SpringBoot 애플리케이션에서 1개의 DB만 사용하는 경우에는 @EnableJpaRepositories를 작성하지 않아도 JpaRepository에 대한 기본적인 설정이 이루어진다.
그러나 2개의 DB를 사용하는 경우에는 2개의 DB 설정 파일을 만들어서 각각 @EnableJpaRepositories에 JpaRepository에 연결할 EntityManagerFactory, TransactionManager를 지정해줘야 한다.
Test, User 2개의 DB를 사용한다고 해보자.
필자는 이에 대해서 각각 TestDBConfig.java, UserDBConfig.java 설정 클래스를 만들었다.
<TestDBConfig.java>
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.example.demo.jpa.repository.sampledata"}, // JpaRepository들이 위치한 패키지
entityManagerFactoryRef = "entityManagerFactory", // 연결할 엔티티 매니저 팩토리
transactionManagerRef = "transactionManager") // 연결할 트랜잭션 매니저
public class TestDBConfig {
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setPackagesToScan(new String[] {"com.example.demo.entity.sampledata"});
emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
emf.setJpaProperties(jpaProperties());
return emf;
}
Properties jpaProperties(){
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
properties.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5InnoDBDialect");
properties.setProperty("hibernate.show_sql","true");
properties.setProperty("hibernate.format_sql","true");
properties.setProperty("hibernate.id.new_generator_mappings","true");
properties.setProperty("hibernate.physical_naming_strategy","org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy");
return properties;
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public PlatformTransactionManager transactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(entityManagerFactory().getObject());
return jpaTransactionManager;
}
}
- Test가 메인 DB이기 때문에 EntityManagerFactory, DataSource, TransactionManager에 @Primary를 붙여주었다.
※ @Primary의 역할 : @Autowired는 bean을 주입 받을 때 1순위로 Bean의 타입을 보고, 해당 Bean의 타입이 2개 이상이라면 2순위로 Bean의 이름을 본다. Bean에 @Primary를 붙이면 Bean의 타입을 볼 때 중복되는 타입이 있다면 2순위로 넘어가지 않고 @Primary가 붙은 Bean을 반환하게 된다.
<UserDBConfig.java>
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.example.demo.jpa.repository.user"},
entityManagerFactoryRef = "userEntityManagerFactory",
transactionManagerRef = "userTransactionManager")
public class UserDBConfig {
@Bean
public LocalContainerEntityManagerFactoryBean userEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(userDataSource());
emf.setPackagesToScan(new String[]{"com.example.demo.entity.user"});
emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
emf.setJpaProperties(jpaProperties());
return emf;
}
Properties jpaProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.format_sql", "true");
properties.setProperty("hibernate.id.new_generator_mappings", "true");
properties.setProperty("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy");
return properties;
}
@Bean
@ConfigurationProperties(prefix = "spring.user.datasource")
public DataSource userDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public PlatformTransactionManager userTransactionManager() {
JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(userEntityManagerFactory().getObject());
return jpaTransactionManager;
}
}
- 메인 DB가 아니라면 @Primary를 붙이지 않도록 주의하자.
반응형
'Spring Series > Spring Boot' 카테고리의 다른 글
[Spring Boot] 프로젝트 AWS에 배포하기 (0) | 2022.01.26 |
---|---|
[Spring Boot] Executable JAR 생성하기 (0) | 2021.08.30 |
[Spring Boot] 예제로 Lombok 쉽게 이해하기 (0) | 2021.07.22 |
[Spring Boot] MVC 패턴 (0) | 2021.07.15 |
[Spring Boot] Spring vs Spring Boot / 개발 환경 설정 (0) | 2021.07.14 |
댓글