본문 바로가기
프로그래밍/Spring

[SpringBoot] HikariCP로 커넥션 풀 수동 설정 방법을 알아보자.

by 곰 옥수수 2025. 6. 22.
728x90
반응형

Spring Boot에서 HikariCP 커넥션 풀을 직접 설정하고, 초기 커넥션 풀을 미리 생성(preload) 하도록 구성하려면 DataSourceConfig.java에서 HikariDataSource를 수동으로 생성하는 방식이 필요하다.

 

[SpringBoot] DataSourceConfig.java 설정 및 역할

DataSourceConfig.java의 역할은 Spring Boot 애플리케이션에서 DB 연결 정보(DataSource)를 커스터마이징하고 관리하는 설정 클래스 입니다. application.yml(properties) 로 설정하면 되지 않나? 라고 생각 할 수도

bears-paw.tistory.com

 

나는 보통 egovframework/spring/context-datasource.xml 파일에 bean등록해서 커넥션 정보를 등록했었다.

springboot에서는 Java 코드 기반 설정을 내가 채택했으므로 DataSourceConfig.java 에 커넥션 정보를 등록하는 거다.

 

Spring Boot 기반이거나, 성능이 중요한 시스템에서는 HikariCP 사용을 추천하고 별도에 이유가 없으면 Hikari를 사용한다.

 

커낵션 설정 방법

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.*;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {

    @Bean
    @Profile("mySql") 
    @Primary
    public DataSource h2HikariDataSource() {
        HikariConfig config = new HikariConfig();

        config.setJdbcUrl("jdbc:mysql://localhost:3306/simpleboard?useSSL=false&serverTimezone=Asia/Seoul");
        config.setUsername("your_user");
        config.setPassword("your_password");
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");

        // 💡 커넥션 풀 설정
        config.setMaximumPoolSize(20);         // 최대 커넥션 수
        config.setMinimumIdle(5);              // 최소 커넥션 수
        config.setIdleTimeout(300000);         // 유휴 커넥션 timeout (ms)
        config.setConnectionTimeout(30000);    // 커넥션 얻기 대기 시간 (ms)
        config.setMaxLifetime(1800000);        // 커넥션 최대 생존 시간 (ms)

        // ✅ 커넥션 풀을 미리 생성하도록 설정
        config.setInitializationFailTimeout(-1); // 초기화 시 실패하면 예외 발생 (-1은 무제한 대기)
        config.setPoolName("HikariPool-SimpleBoard");

        HikariDataSource dataSource = new HikariDataSource(config);

        // 💡 초기 커넥션을 미리 확보하려면 다음 코드 실행 (강제 preload)
        try {
            for (int i = 0; i < config.getMinimumIdle(); i++) {
                dataSource.getConnection().close();
            }
        } catch (Exception e) {
            throw new RuntimeException("Failed to preload Hikari connections", e);
        }

        return dataSource;
    }
}

 

 

egov에서 커넥션 설정했던 예시

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 커넥션 풀 설정 (예: Apache Commons DBCP2) -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
        <property name="username" value="egov"/>
        <property name="password" value="egovpass"/>

        <!-- 커넥션 풀 설정 -->
        <property name="initialSize" value="5"/>             <!-- 초기 커넥션 수 -->
        <property name="maxTotal" value="20"/>               <!-- 최대 커넥션 수 -->
        <property name="maxIdle" value="10"/>                <!-- 최대 유휴 커넥션 수 -->
        <property name="minIdle" value="2"/>                 <!-- 최소 유휴 커넥션 수 -->
        <property name="maxWaitMillis" value="10000"/>       <!-- 커넥션 획득 대기 시간 -->
    </bean>

    <!-- 트랜잭션 매니저 설정 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>
728x90
반응형

댓글