Spring Boot DataSource

TMT

1. 기본 HikariCP 사용 & 자동 구성

  • ✅ 사실 확인:
    Spring Boot 2.x 이상에서는 HikariCP가 기본 커넥션 풀입니다.
    • spring.datasource.url, username, password만 설정하면 자동으로 DataSource 빈이 등록됩니다.
    • 별도의 DataSource 빈을 정의하지 않아도 됩니다.
    • HikariCP의 추가 설정은 spring.datasource.hikari.*로 할 수 있습니다.
      spring.datasource.hikari.maximum-pool-size=10
      spring.datasource.hikari.connection-timeout=30000

2. routingDataSource와 같은 복잡한 설정

  • ✅ 사실 확인:
    여러 데이터소스를 사용하거나 동적 라우팅이 필요한 경우 (예: Read/Write 분리, 멀티 테넌시), 명시적인 설정이 필요합니다.
    • 자동 구성의 한계: Spring Boot의 자동 구성은 단일 DataSource만을 지원합니다.
    • 해결 방법:
      1. AbstractRoutingDataSource를 상속한 커스텀 데이터소스를 정의합니다.
      2. @Primary를 사용해 기본 데이터소스를 명시합니다.
      3. 필요 시 자동 구성을 비활성화합니다 (@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)).

3. 예시: routingDataSource 설정

@Configuration
public class DataSourceConfig {

    // Writer DataSource (Primary)
    @Bean
    @ConfigurationProperties("spring.datasource.writer")
    @Primary
    public DataSource writerDataSource() {
        return DataSourceBuilder.create().build();
    }

    // Reader DataSource
    @Bean
    @ConfigurationProperties("spring.datasource.reader")
    public DataSource readerDataSource() {
        return DataSourceBuilder.create().build();
    }

    // Routing DataSource
    @Bean
    public DataSource routingDataSource(
        @Qualifier("writerDataSource") DataSource writer,
        @Qualifier("readerDataSource") DataSource reader
    ) {
        ReplicationRoutingDataSource routingDataSource = new ReplicationRoutingDataSource();
        Map<Object, Object> dataSourceMap = new HashMap<>();
        dataSourceMap.put("writer", writer);
        dataSourceMap.put("reader", reader);
        routingDataSource.setTargetDataSources(dataSourceMap);
        routingDataSource.setDefaultTargetDataSource(writer);
        return routingDataSource;
    }
}

4. 주의사항

  • 자동 구성 비활성화:
    커스텀 DataSource 빈을 정의하면 Spring Boot의 자동 구성이 비활성화됩니다.
    • 트랜잭션 관리자(PlatformTransactionManager), 엔티티 매니저 팩토리(EntityManagerFactory)도 직접 설정해야 합니다.
  • HikariCP 우선순위:
    다른 커넥션 풀 (예: Tomcat JDBC)이 클래스패스에 있으면 HikariCP 대신 사용될 수 있습니다.
    • 명시적으로 HikariCP를 지정하려면 spring.datasource.type=com.zaxxer.hikari.HikariDataSource를 설정합니다.

✅ 정리

  • 기본 구성: spring.datasource.url, username, password만으로 HikariCP 기반 DataSource가 자동 구성됩니다.
  • 복잡한 구성: Read/Write 분리와 같은 고급 시나리오에서는 명시적인 설정이 필수입니다.
Edit this page

On this Page