티스토리 뷰
1. 다중 DB 설정 시, 알아야 할 것2. 소스코드2-1. Entity2-2. Repository2-3. DB Configuration2-3-1 application.properties2-3-2 Main Datasource2-3-3 Second Datasource4. Test4.1 hibernate 로그 확인4.2 DB 데이터 확인
1. 다중 DB 설정 시, 알아야 할 것
다중 DB는 Spring boot 처럼 Auto Configuration되지 않음
설정파일(application.yml 또는 application.properties) 값을 읽어와서 연동 할 DB 수 만큼 Datasource를 수동 설정해야함
- 설정파일 대신 코드로 직접 설정할 수 있는 방법도 있음
주요 설정 내용
리소스 경로 설정
- Repository basePackages 경로 설정
- Entity 경로 설정
DB 정보 설정(Datasource)
- driver 이름
- URL
- Id/Password
Hibernate 설정
ddl-auto
dialect
설정된 다중 DB는 Repository package 명으로 구분
초기 설정이 복잡한 편이나, 천천히 살펴보면 크게 어렵지 않음
2. 소스코드
이 글에서는 1개의 Entity로 2개의 Database에 값을 넣는 예제로 진행합니다.
2-1. Entity
- 두 개의 DB에서 공용으로 사용할 Entity를 생성합니다.
xxxxxxxxxxpackage com.jpa.master.entity;(schema = "users")public class User { (strategy = GenerationType.IDENTITY) private int id; private String name; (unique = true, nullable = false) private String email; private int age;}
2-2. Repository
- 서로 다른 패키지에 User Repository를 작성 (패키지가 다르다고 하여 파일명을 동일하게 하면 안됨)
xxxxxxxxxxpackage com.jpa.master.repository;public interface UserMasterRepository extends JpaRepository<User, Integer> {}xxxxxxxxxxpackage com.jpa.second.repository;public interface UserSecondRepository extends JpaRepository<User, Integer> {}
2-3. DB Configuration
2-3-1 application.properties
- Prefix부분은 자유롭게 입력 가능 (spring.datasource, spring.second-datasource)
- 그 뒤에 property명은 오타가 나지 않도록 주의 (username, password, jdbcUrl)
xxxxxxxxxx#### Master DataSource Configuration1spring.datasource.username=[user]spring.datasource.password=[Password]spring.datasource.jdbcUrl=[URL]#### Second DataSource Configuration2spring.second-datasource.username=[user]spring.second-datasource.password=[Password]spring.second-datasource.jdbcUrl=[URL]driver class name을 설정하는 property가 빠져있는데,
jdbcUrl로 부터 driver name을 읽어와서 자동으로 설정하기 때문에 별도로 설정 하지 않아도 됨
2-3-2 Main Datasource
Master DB용 java 설정파일 생성
설정 파일은 다음과 같이 구성되어 있음
DataSource 설정
EntityManagerFactory 설정
TransactionManager 설정
다중 DB를 설정할 때는, @Primary 어노테이션을 이용하여 Master가되는 Datasouce를 지정해야한다.
xxxxxxxxxx({ "classpath:application.properties" })( basePackages = "com.jpa.master.repository", // 1. Repository 경로 entityManagerFactoryRef = "masterEntityManager", transactionManagerRef = "masterTransactionManager")public class MainDatabaseConfig { private Environment env; public LocalContainerEntityManagerFactoryBean masterEntityManager() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(masterDataSource()); //Entity 패키지 경로 em.setPackagesToScan(new String[] { "com.jpa.master.entity" }); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); //Hibernate 설정 HashMap<String, Object> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto",env.getProperty("hibernate.hbm2ddl.auto")); properties.put("hibernate.dialect",env.getProperty("hibernate.dialect")); em.setJpaPropertyMap(properties); return em; } (prefix="spring.datasource")//prefix를 이용한 설정의 경우, 해당 어노테이션 선언 필요 public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } public PlatformTransactionManager masterTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(masterEntityManager().getObject()); return transactionManager; }}- @ConfigurationProperties 어노테이션없이 설정하는 원시적인 방법
xxxxxxxxxx public DataSource masterDataSource() { // property명은 application.properties 파일에서 자유롭게 설정 가능 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); dataSource.setUrl(env.getProperty("jdbc.main.url")); dataSource.setUsername(env.getProperty("jdbc.user")); dataSource.setPassword(env.getProperty("jdbc.password")); return dataSource; }
2-3-3 Second Datasource
두번째 DB용 java 설정파일 생성 (설정 파일 구성은 메인과 동일함)
소스코드 복붙하다가 하는 실수
- @Primary 어노테이션은 꼭 지워야 함
xxxxxxxxxx({ "classpath:application.properties" })( basePackages = "com.jpa.second.repository", entityManagerFactoryRef = "secondEntityManager", transactionManagerRef = "secondTransactionManager")public class SecondConfig { private Environment env; public LocalContainerEntityManagerFactoryBean secondEntityManager() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(secondDataSource()); em.setPackagesToScan(new String[] { "com.jpa.master.entity" }); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); HashMap<String, Object> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); properties.put("hibernate.dialect", env.getProperty("hibernate.dialect")); em.setJpaPropertyMap(properties); return em; } (prefix="spring.second-datasource") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } public PlatformTransactionManager secondTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(secondEntityManager().getObject()); return transactionManager; }}
4. Test
- 간단한 Insert Test 코드 작성
xxxxxxxxxx(SpringJUnit4ClassRunner.class)(replace = Replace.NONE)public class JPAMultipleDBTest { UserMasterRepository masterRepo; UserSecondRepository secondRepo; public void insertTest() { User user = new User(); user.setAge(28); user.setEmail("test@spring.com"); user.setName("name"); secondRepo.save(user); masterRepo.save(user); }}4.1 hibernate 로그 확인

4.2 DB 데이터 확인
- 테이블이 각 DB에 생성되었음

- 각 DB 데이터 확인


'Java > JPA' 카테고리의 다른 글
| [Spring boot] JPA Dialect(방언) 설정에 관하여 (3) | 2020.11.11 |
|---|---|
| Spring Data JPA Save(insert) 속도 최적화 (1) | 2020.03.13 |
| JPA (Java Persistence API) 이란? 기본 개념 및 이론 정리 (1) | 2019.08.01 |
- Total
- Today
- Yesterday
- SDK
- 구글 드라이브 개발
- 리스트 소스 코드
- 후지필름X100V
- 후지필름 일렉트로닉
- C
- 구글 드라이브
- X100v
- C++
- 링크드리스트
- 삼성ssd
- 링크드리스트 클래스
- 샌디스크ssd
- SSD
- 구글 드라이브 API
- 리스트 클래스
- 후지필름
- ssd성능
- ssd추천
- ssd비교
- Google Drive SDK
- 리스트
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
