Spring Boot · 2026-02-13

Spring Boot + MySQL HikariCP 최적화 설정

Spring Boot와 MySQL 환경에서 HikariCP 커넥션 풀의 동작 원리와 주요 파라미터별 영향, 실무 적용 예제 및 진단 점검 항목을 정리한 참고자료

작성일 : 2026-02-13 ㆍ 작성자 : 관리자
post
목차

소개

Spring Boot 애플리케이션에서 MySQL을 사용할 때 커넥션 풀 성능은 전체 응답 시간과 안정성에 큰 영향을 미친다. HikariCP는 경량이면서도 빠른 커넥션 풀로 널리 쓰인다. 본문은 HikariCP의 핵심 원리와 설정 항목, 실제 환경에서 튜닝하는 절차를 초보자도 이해하기 쉬운 흐름으로 설명한다.

커넥션 풀 기초 개념

커넥션 풀은 데이터베이스 연결을 재사용해 비용이 큰 연결/해제 작업을 줄이는 역할을 한다. 풀 크기, 유휴 상태 유지 시간, 커넥션 검증 방식이 성능과 리소스 소비에 직접적인 영향을 미친다.

핵심 용어

  • maximumPoolSize: 동시에 열 수 있는 최대 커넥션 수
  • minimumIdle: 최소 유휴 커넥션 수
  • connectionTimeout: 커넥션 획득 대기 시간
  • idleTimeout: 유휴 커넥션을 유지하는 시간
  • maxLifetime: 커넥션의 최대 수명

HikariCP 특징

HikariCP는 낮은 레이턴시와 적은 메모리 오버헤드를 목표로 설계되었다. 내부적으로 빠른 알고리즘을 사용해 동시성 환경에서 높은 처리량을 제공한다. 기본 설정이 안전하고 대부분의 일반 상황에서 좋은 성능을 내지만, 트래픽 패턴과 DB 특성에 따라 튜닝이 필요하다.

주요 파라미터와 영향 분석

각 파라미터는 애플리케이션과 데이터베이스의 특성을 고려해 결정한다. 다음은 흔히 조정하는 항목과 영향이다.

maximumPoolSize

동시 커넥션 수를 제한한다. 애플리케이션의 동시 쿼리 수와 MySQL의 동시 처리 능력을 고려해야 한다. 너무 작으면 대기 시간이 길어지고, 너무 크면 DB 자원 고갈과 컨텍스트 스위칭 비용이 증가한다.

minimumIdle

유휴 커넥션을 유지해 급격한 트래픽 증가에 빠르게 대응한다. 트래픽이 꾸준히 높은 환경에서는 minimumIdle을 maximumPoolSize에 가깝게 맞추면 지연을 줄일 수 있다.

connectionTimeout

커넥션을 얻기 위한 최대 대기 시간이다. 낮게 설정하면 대기 중인 요청이 빠르게 실패해 장애 징후를 조기에 발견할 수 있다. 반대로 너무 낮으면 일시적 부하로 인한 불필요한 실패가 발생할 수 있다.

idleTimeout과 maxLifetime

idleTimeout은 유휴 커넥션을 얼마나 오래 유지할지 결정하고, maxLifetime은 커넥션을 재시작하는 주기를 정한다. 데이터베이스 쪽에서 커넥션을 강제 종료하는 설정이 있으면 maxLifetime을 그보다 짧게 설정해 재귀션을 방지한다.

튜닝 절차

  • 현재 동작 지표 수집: QPS, 평균 응답시간, 활성 커넥션 수
  • 문제 유형 파악: 연결 부족(대기 발생) vs DB 과부하(응답 지연)
  • 기본값 조정: maximumPoolSize, connectionTimeout, minIdle 우선 설정
  • 사후 모니터링: 커넥션 획득 실패, 대기 시간 변화 관찰
  • 세부 튜닝: idleTimeout, maxLifetime, validationTimeout 조정

실제 설정 예

Spring Boot의 application.yml 예시와 Java 설정 예제를 함께 둔다. YAML이나 properties 방식에서 공통으로 사용할 수 있는 핵심 항목들이다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: myuser
    password: mypass
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 50
      minimum-idle: 10
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000
      validation-timeout: 5000
      pool-name: HikariCP-MyApp

Java로 DataSource를 직접 빈으로 등록하는 경우 예제:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataSourceConfig {

  @Bean
  public HikariDataSource dataSource() {
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
    config.setUsername("myuser");
    config.setPassword("mypass");
    config.setMaximumPoolSize(50);
    config.setMinimumIdle(10);
    config.setConnectionTimeout(30000);
    config.setIdleTimeout(600000);
    config.setMaxLifetime(1800000);
    config.setPoolName("HikariCP-MyApp");
    return new HikariDataSource(config);
  }
}

모니터링과 진단

문제 탐지에는 메트릭 수집이 중요하다. HikariCP는 JMX를 통해 풀 상태를 제공한다. Spring Actuator를 통해 노출하면 애플리케이션 단계에서 빠르게 확인 가능하다.

  • 활성/유휴 커넥션 수 추적
  • 커넥션 획득 대기 발생 여부 확인
  • DB 쪽 동시 연결 제한 및 slow query 로그 점검

문제 상황별 체크리스트

  • 대기 시간 증가: maximumPoolSize 증가 또는 쿼리 최적화 필요
  • DB CPU/메모리 포화: 풀 크기 축소와 쿼리 튜닝 병행
  • 커넥션 유실/타임아웃: validationTimeout과 테스트 쿼리 설정 검토
  • 짧은 연결 끊김: maxLifetime 값과 DB의 타임아웃 정책 정합성 확인

권장 설정 범위와 주의점

권장값은 환경에 따라 다르다. 작은 서비스는 maximumPoolSize 10~30, 대규모는 50 이상을 고려한다. 다만 DB 인스턴스의 동시 연결 상한과 리소스 여유를 반드시 확인해야 한다. 또한 애플리케이션 레벨에서 불필요한 커넥션 보유(트랜잭션 범위 확장 등)를 피하는 것이 우선이다.

마무리

HikariCP 튜닝은 수치 조정만이 아니라 쿼리 최적화와 인프라 관점의 균형이 중요하다. 작은 변경을 적용한 뒤 모니터링 결과를 기반으로 반복적으로 조정하는 방식이 안정적이다. 위 설정과 절차는 Spring Boot와 MySQL 환경에서 실무에 바로 적용 가능한 출발점 역할을 한다.

spring boot hikaricp 설정 hikaricp 튜닝 mysql spring boot spring boot mysql connection pool HikariCP MySQL 튜닝 커넥션 풀 데이터베이스 성능 Spring Boot 성능