2025년 3월 6일
이론
카테고리 : DB
조회 : 85|3분 읽기

HikariCP

HikariCP: 최고의 JDBC 커넥션 풀을 유지하는 비결

🚨 이 글은 DB < 방화벽 > 서버 구조에서 방화벽의 패킷 오인으로 인해 네트워크 유실 및 커넥션 끊김 장애를 경험한 후, 이를 해결하기 위해 HikariCP를 공부하는 과정에서 정리한 내용입니다.

1. HikariCP란?

HikariCP는 가볍고 빠르며 안정적인 JDBC 커넥션 풀 라이브러리입니다.
스프링 부트 2.0 이후 기본 커넥션 풀로 채택될 만큼 성능과 효율성이 검증되었으며
낮은 대기 시간(latency)
높은 처리량(throughput)
강력한 안정성
을 자랑합니다.
하지만 HikariCP가 단순히 "빠르다" 는 이유만으로 최고의 커넥션 풀이 된 것은 아닙니다.
불필요한 오버헤드를 줄이고, 빠른 응답 속도를 유지하며, 안정성을 극대화하는 다양한 최적화 기법이 적용되어 있습니다.

2. HikariCP가 다른 커넥션 풀보다 빠른 이유

HikariCP는 기존 커넥션 풀과 비교해 불필요한 동기화를 최소화하고, 커넥션 관리를 효율적으로 최적화한 것이 특징입니다.
이를 가능하게 한 대표적인 기술들을 소개하겠습니다.

① FastPath Pooling: 최소한의 동기화

기존의 커넥션 풀들은 멀티스레드 환경에서 동기화 비용이 병목(bottleneck)이 되는 문제가 있었습니다.
HikariCP는 이를 해결하기 위해 FastPath Pooling 기법을 도입하여 커넥션 풀에서 커넥션을 가져오고 반환하는 과정을 극단적으로 최적화했습니다.
  • JIT 최적화 : Java의 Just-In-Time (JIT) 컴파일러를 활용해 Hotspot 최적화 극대화
  • CAS (Compare-And-Swap) 활용 : 기존 동기화 방식 대신 원자적 연산(Atomic Operation)으로 동기화 비용 제거
  • Queue-Free 구조 : 기존의 큐(Queue) 기반 커넥션 관리 대신 ConcurrentBag을 활용한 빠른 커넥션 핸들링
FastPath Pooling 덕분에 동기화 비용을 줄이고 커넥션 획득 속도를 극대화할 수 있습니다.

② 최적화된 Connection 객체 관리

HikariCP는 불필요한 객체 생성을 최소화하여 커넥션을 효율적으로 관리합니다.

1. Proxy 객체 최소화

  • 일반적인 커넥션 풀에서는 Connection, Statement, ResultSet 객체를 매번 Proxy로 감싸 관리 → GC 부담 증가
  • HikariCP는 필요할 때만 최소한의 Proxy 객체를 사용하여 GC 부담을 줄이고 성능을 향상.

2. 최소한의 메모리 할당

  • 객체를 미리 할당하여 재사용 (Object Reuse)
  • 불필요한 객체 생성을 최소화하여 GC(Garbage Collection) 부담 최소화
  • 필요 없는 기능(예: Statement caching)을 제거하여 경량화
이 결과, HikariCP는 낮은 메모리 사용량을 유지하면서도 높은 성능을 보장합니다.

3. Connection Validation: 네트워크 장애 대응

HikariCP는 기존의 "SELECT 1" 쿼리 방식 이 아닌, 네트워크 기반 검증(Network Timeout-based Validation) 을 사용합니다.
이를 통해 DB 부하를 줄이고 빠른 장애 감지가 가능합니다.

🚀 어떻게 동작할까?

HikariCP는 Socket Keep-Alive와 Network Timeout을 활용한 검증 방식을 사용합니다.
1. TCP 네트워크 상태 확인
  • HikariCP는 커넥션을 획득할 때 DB 소켓의 네트워크 상태를 직접 확인
  • 만약 TCP 연결이 끊어졌다면, 즉시 비정상적인 커넥션으로 판단하고 제거
2. Socket Timeout을 활용한 빠른 감지
  • connectionTimeout 내에 응답이 없으면 해당 커넥션을 즉시 폐기
  • 불필요한 SQL 실행 없이 빠르게 비정상 커넥션을 감지
3. 빠른 장애 감지 (Fast-Fail Detection)
  • DB 서버 장애 발생 시 즉시 감지하여 대기 시간을 최소화
  • validationTimeout 설정을 통해 지정된 시간 내 응답이 없을 경우 즉시 타임아웃 처리
📌 HikariCP 설정 (Spring Boot application.properties)
properties
1# 빠른 장애 감지를 위한 설정
2spring.datasource.hikari.validation-timeout=250
3spring.datasource.hikari.connection-timeout=3000

4. 최적의 설정값 추천

설정값설명기본값
minimumIdle최소한으로 유지할 커넥션 수10
maximumPoolSize최대 커넥션 개수10
idleTimeout유휴 상태의 커넥션을 유지하는 시간(ms)600000 (10분)
maxLifetime커넥션의 최대 수명(ms)1800000 (30분)
connectionTimeout커넥션을 획득하는 최대 대기 시간(ms)30000 (30초)
validationTimeout커넥션 유효성을 검사하는 최대 시간(ms)5000 (5초)
leakDetectionThresholdConnection Leak 감지 시간(ms)0 (비활성화)
📌 설정값 조정 가이드
  • maximumPoolSize : 데이터베이스의 최대 커넥션 수와 애플리케이션의 동시 요청량을 고려하여 설정
  • idleTimeout : 너무 짧게 설정하면 불필요한 커넥션 재생성이 발생할 수 있음
  • maxLifetime : DB의 설정값보다 약간 짧게 설정하여, DB에서 커넥션이 강제 종료되기 전에 안전하게 반환되도록 설정
  • leakDetectionThreshold : 특정 값(예: 15000 ms)으로 설정하면 커넥션 반환이 늦어지는 문제를 감지 가능

5. 결론

HikariCP는 단순한 "빠른 커넥션 풀" 이 아닙니다.
불필요한 동기화를 제거하고, Connection 객체를 최적화하며, 네트워크 기반 검증을 수행하는 최적화된 JDBC 커넥션 풀입니다.
✅ 장점🚀 설명
낮은 레이턴시와 높은 처리량FastPath Pooling과 최적화된 Connection 관리
불필요한 리소스 낭비 최소화메모리 사용 최적화 및 Proxy 객체 최소화
강력한 장애 감지 및 복구Network Timeout 기반 검증과 Fast-Fail Detection
멀티스레드 환경에서의 안정성Lock-Free 구조의 ConcurrentBag 사용
그냥 스프링 부트에 붙어있으니 아무 생각 없이 사용했지만 왜 메이저 프레임워크가 채택했는지 알 수 있는 공부시간 이었습니다.