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
반응형

+ Recent posts