728x90
반응형
✅ 선택 가능한 전략 요약 (Spring Boot 기준)
전략 | 설명 | 장점 | 단점 |
1️⃣ 정적 멀티 Datasource | @Primary, @Qualifier, 설정별 Bean 선언 | 간단, 적은 대상일 때 | 데이터소스가 고정되어야 함 |
2️⃣ RoutingDatasource (동적 선택) | 요청마다 lookupKey 기반 DB 연결 | 여러 타겟 DB 지원 | 구현 복잡도 다소 있음 |
3️⃣ 직접 JDBC Connection | DB URL, ID/PW로 직접 connection 생성 | 진짜 동적으로 가능 | 커넥션풀 없음 → 성능 고려 필요 |
4️⃣ MyBatis Dynamic Datasource Plugin | 플러그인 사용 | 빠름, 정리되어 있음 | MyBatis 기반 한정 |
→ 여러 타겟의 DB 정보를 동적으로 받아야 하는 경우는 보통 2번 또는 3번이 현실적입니다.
✅ 1. Routing DataSource 방식 (정교한 다중 DB 연결 관리)
핵심 구성
- AbstractRoutingDataSource 상속
- ThreadLocal 또는 context holder에 대상 DB 키 저장
- DB config map으로부터 datasource 선택
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getCurrentKey(); // ThreadLocal 기반
}
}
설정
spring:
datasource:
dynamic:
db1:
url: jdbc:mysql://db1-url
username: user1
db2:
url: jdbc:oracle:thin:@db2-url
username: user2
✅ 2. 직접 JDBC Connection 방식 (가장 유연함)
실제 실무에서는 아래처럼 많이 사용합니다:
public Connection getConnectionForTarget(TargetDbInfo dbInfo) throws SQLException {
String url = dbInfo.getJdbcUrl(); // 예: jdbc:oracle:thin:@...
String user = dbInfo.getUsername();
String pass = dbInfo.getPassword();
return DriverManager.getConnection(url, user, pass); // 직접 연결
}
그리고 try-with-resources로 PreparedStatement 생성하여 직접 insert
try (Connection conn = getConnectionForTarget(targetInfo);
PreparedStatement stmt = conn.prepareStatement("INSERT INTO ...")) {
stmt.setString(1, value);
stmt.executeUpdate();
}
✅ 장점
- DB 종류와 무관 (MySQL, Oracle, MSSQL, PostgreSQL 등 모두 가능)
- 전혀 고정되지 않은 연결 정보 처리 가능 (e.g. 웹에서 API로 받은 DB 정보)
⚠️ 주의
- 커넥션 풀 없음 (성능 이슈 고려)
- 트랜잭션/예외/timeout 직접 제어 필요
- 대량 처리 시 HikariCP 등으로 수동 풀 생성 고려
✅ 실무 추천 전략
상황 | 추천 방식 |
이기종 DB 수 2~5개, 고정 | AbstractRoutingDataSource 방식 |
이기종 DB가 계속 늘어나고 유저 입력 기반 연결 | ✅ JDBC 직접 연결 방식 권장 |
MyBatis 기반 프로젝트 | mybatis-spring-boot-starter + dynamic plugin |
대량 쓰기, 성능 중요 | HikariCP + 커넥션 수동 관리 구조 고려 |
✨ 보너스: JDBC URL 예시
DBJDBC | URL 예시 |
MySQL | jdbc:mysql://host:3306/db |
Oracle | jdbc:oracle:thin:@host:1521:sid |
PostgreSQL | jdbc:postgresql://host:5432/db |
MSSQL | jdbc:sqlserver://host:1433;databaseName=db |
✅ 결론
질문 | 답변 |
이기종 DB에 insert 해야 할 때 어떻게 해야 하나요? | 고정 DB라면 RoutingDatasource, 완전 동적이라면 직접 JDBC 연결 방식 권장 |
Spring Boot에서 JDBC 연결을 직접 할 수 있나요? | ✅ 예, DriverManager.getConnection(...) 방식으로 가능합니다 |
성능이나 확장성 고려할 점은? | 커넥션 풀 구성, timeout 설정, 트랜잭션 처리 필요 |
728x90
반응형
'Java' 카테고리의 다른 글
Kafka Dead Letter 처리 구조란 (0) | 2025.06.18 |
---|---|
Retry Backoff 알고리즘 예제 (1) | 2025.06.18 |
EAI 시스템 아키텍처 예시 (0) | 2025.06.18 |
Webflux 기반의 SSE는 왜 수천~만개까지 가능할까 (0) | 2025.06.18 |
Google Calendar API에 일정(Event)을 추가(POST) (1) | 2025.06.16 |