![[Spring, SpringBoot] 다중 DB 연동하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfY4UB%2FbtsJX6CkL59%2FA6f2nytmPzuhQC9KFBOwEk%2Fimg.png)
Spring Boot와 Mabatis를 사용하는 프로젝트를 진행하는 중 데이터베이스를 한 프로젝트 내부에서 두개 사용해야될 일이 생겼다.
같은 서버, 같은 포트에 등록 되어 있어서(스키마만 다르다.) 쿼리 작성 시 테이블명 앞에 스키마명만 추가해주는 방법도 있지만, 추후 마이그레이션으로 인한 서버 이전과 확장성을 고려하여 DB를 다중으로 연동하기로 했다 !
💁♂️ DB정보 관리하기
applicatio.properties 또는 .yml 파일에 사용할 두 DB의 정보를 입력해줍니다.
## main DB
spring.main.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.main.datasource.jdbc-url=jdbc:log4jdbc:mariadb://서버명:포트/스키마명?serverTimezone=Asia/Seoul
spring.main.datasource.username=아아디
spring.main.datasource.password=비밀번호
## sub DB
spring.sub.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.sub.datasource.jdbc-url=jdbc:log4jdbc:mariadb://서버명:포트/스키마명?serverTimezone=Asia/Seoul
spring.sub.datasource.username=아아디
spring.sub.datasource.password=비밀번호
여기서 주의해야될 점은 url의 정보를 입력할 때 jdbc-url로 입력해줘야합니다 !
아니면 아래와 같은 에러가 발생할 수 있습니다. spring.datasource.url은 Spring Boot에서 기본으로 사용하는 프로퍼티이기 때문이라고 합니다 !
⚙️ Config 파일 설정하기
DB가 두 개일 경우 각각 파일을 만들어 설정을 따로 해줘야합니다 ! 물론 DB가 세 개일 경우 설정 Config 파일은 세 개겠죠 !?
config 파일의 설정은 아래와 같이 설정했습니다.
DataSource는 application.properties에서 정의한 DB의 연결 정보를 빌드합니다.
SqlSessionFactory는 세션 생성 시, 빌드된 DataSource를 세팅하고 SQL을 관리할 mapper.xml의 경로를 입력해줍니다.
PlatformTransactionManager는 DB의 트랙젝션을 관리합니다.
SqlSessionTemplate는 Mabatis의 세션을 생성하고 관리합니다.
@Configuration
@RequiredArgsConstructor
@MapperScan(value="mapper 파일이 있는 디렉토리 경로", sqlSessionFactoryRef="subSqlSessionFactory")
// 파일의 경로가 여러개일 경우 -> {"", "", ""}
@EnableTransactionManagement
public class SubDatabaseConfig {
@Primary
@Bean(name="subDataSource")
@ConfigurationProperties(prefix="spring.sub.datasource")
public DataSource managerDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name="subSqlSessionFactory")
public SqlSessionFactory subSqlSessionFactory(@Qualifier("subDataSource") DataSource subDataSource, ApplicationContext applicationContext) throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(subDataSource);
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:subMapper/**/*.xml"));
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
return sqlSessionFactoryBean.getObject();
}
@Primary
@Bean(name="subSqlSessionTemplate")
public SqlSessionTemplate managerSqlSessionTemplate(@Qualifier("subSqlSessionFactory")SqlSessionFactory subSqlSessionFactory) throws Exception{
return new SqlSessionTemplate(subSqlSessionFactory);
}
@Bean
public PlatformTransactionSub subTransactionManager(@Qualifier("subDataSource") DataSource subDataSource) {
return new DataSourceTransactionManager(subDataSource);
}
}
'프로그래밍 > Java' 카테고리의 다른 글
[Java, Spring] 코드 문서화를 위한 주석 규칙 알아보기 (0) | 2024.10.31 |
---|---|
[Java, Spring] Linux 파일 서버 경로 연결하기 (5) | 2024.10.01 |
[Spring, Swagger] Swagger 적용하기 및 기본 경로 변경하기 (2) | 2024.09.21 |
[Java, 자바] Mybatis Map foreach로 반복하기 (0) | 2024.09.10 |
[Java, Spring] @ControllerAdvice, @RestControllerAdvice란 ? (5) | 2024.09.01 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!