본문 바로가기
Database & Storage

JDBC 커넥션 풀(Connection Pool) 이해하기 — HikariCP 실무 설정 가이드

by yamoojin83 2025. 11. 17.

JDBC 커넥션 풀(Connection Pool) 이해하기 — HikariCP 실무 설정 가이드

SQL 튜닝으로 쿼리 성능을 개선했다면, 이제는 DB 연결 자체의 효율성을 살펴볼 차례입니다.

매번 DB 연결을 새로 맺는 것은 비효율적이며, 실무에서는 대부분 커넥션 풀(Connection Pool)을 사용해 DB 연결을 재사용합니다.

이번 글에서는 자바 백엔드에서 가장 많이 쓰이는 HikariCP를 중심으로 커넥션 풀의 개념과 실제 설정 방법을 단계별로 알아봅니다.

 

1. 커넥션 풀(Connection Pool)이란?

DB에 접근하려면 JDBC를 통해 Connection 객체를 생성해야 합니다.

하지만 이 객체를 매번 새로 만드는 것은 큰 비용이 듭니다.
연결 과정에는 TCP/IP 연결, 인증, 세션 설정이 포함되기 때문입니다.

그래서 서버는 DB 연결을 미리 일정 개수 확보해두고, 필요할 때 빌려 쓰는 방식을 사용합니다. 이것이 Connection Pool입니다.

💡 간단히 말해, 매번 “DB 문을 여닫는 것”이 아니라, “열린 문을 여러 번 이용”하는 구조입니다.

2. HikariCP란?

HikariCP는 “가장 빠르고 가벼운” 자바용 커넥션 풀 라이브러리입니다.

Spring Boot 2.x 이상에서는 기본 커넥션 풀로 내장되어 있으며, 과거의 DBCP, C3P0보다 훨씬 빠른 속도를 자랑합니다.

  • 초경량 구조 (jar 크기 약 130KB)
  • 매우 짧은 커넥션 획득 시간 (~2μs)
  • 자동 타임아웃 관리 및 연결 유효성 검사
  • Spring Boot 자동 설정 지원

# application.properties 예시
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000

이 설정은 기본값으로도 충분하지만, 트래픽 패턴에 맞게 조정하면 훨씬 효율적입니다.

3. 커넥션 풀 동작 원리

커넥션 풀의 기본 동작은 다음과 같습니다.

  1. 서버가 시작될 때 미리 n개의 DB 연결을 생성합니다.
  2. 요청이 들어오면 Connection 객체를 빌려줍니다.
  3. 요청이 끝나면 Connection을 닫지 않고 “반납”합니다.
  4. 풀은 반납된 커넥션을 다시 재사용합니다.

💡 주의: Connection을 닫지 않고 계속 잡고 있으면 풀의 여유 연결이 부족해져 “Connection Timeout”이 발생할 수 있습니다.

따라서 반드시 try-with-resourcesfinally 블록으로 닫아야 합니다.


try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM users")) {
     ResultSet rs = ps.executeQuery();
     ...
} catch (SQLException e) {
     e.printStackTrace();
}

 

hikariCP connection flow sequence diagram

4. 주요 설정 파라미터 해설

실무에서 자주 조정하는 HikariCP 설정 항목은 다음과 같습니다.

항목 설명 권장값
maximum-pool-size 최대 커넥션 수 10~30 (트래픽에 따라)
minimum-idle 유휴 상태로 유지할 최소 커넥션 5
connection-timeout 커넥션 획득 최대 대기 시간(ms) 30,000
idle-timeout 유휴 커넥션 종료 시간(ms) 30,000~600,000
max-lifetime 커넥션의 전체 생명주기(ms) 30분(1,800,000)

💡 튜닝 팁:
- 트래픽이 많을수록 maximum-pool-size를 늘리되, DB 연결 제한을 초과하지 않도록 조정
- max-lifetime은 DB의 keep-alive 시간보다 짧게 설정 (MySQL은 8시간이 기본)

5. Spring Boot에서 자동 설정 확인

Spring Boot는 HikariCP를 기본 DataSource로 사용합니다.

다음 명령으로 어떤 풀을 사용하는지 확인할 수 있습니다.


@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
        DataSource ds = ctx.getBean(DataSource.class);
        System.out.println("DataSource class: " + ds.getClass().getName());
    }
}

출력 예시:
DataSource class: com.zaxxer.hikari.HikariDataSource

별도 설정 없이도 HikariCP가 자동 적용된 것을 확인할 수 있습니다.

6. 성능 비교: HikariCP vs DBCP vs C3P0

벤치마크 기준으로 HikariCP는 다른 풀보다 약 30~50% 빠른 커넥션 획득 속도를 보입니다.


테스트 기준: 100,000회 DB 요청 / 10개 스레드
───────────────────────────────
HikariCP : 1.9초
DBCP     : 3.2초
C3P0     : 5.5초
───────────────────────────────

HikariCP는 내부적으로 락(lock) 최소화, 객체 재사용, JIT 최적화된 코드 경로 등을 통해 고속 처리를 달성합니다.

따라서 트래픽이 많은 웹서비스나 REST API 서버에서 거의 표준처럼 사용됩니다.

7. 실무에서 자주 겪는 문제와 해결

① Connection Timeout

원인: 사용 중인 커넥션이 반납되지 않아 풀에 여유가 없음.

해결: 반드시 try-with-resources 구문으로 커넥션 닫기.

② Too many connections (DB 에러)

원인: 풀의 maximum-pool-size가 DB의 max_connections보다 큼.

해결: DB 설정 또는 풀 크기 조정.

③ Connection Leak Detection

HikariCP는 자동으로 커넥션 누수를 감지할 수 있습니다.

설정:


spring.datasource.hikari.leak-detection-threshold=20000

20초 이상 반납되지 않으면 경고 로그를 출력합니다.

💡 로그 예시:
Connection leak detection triggered for connection ... lastOpenStackTrace...

 

hikariCP monitoring metrics dashboard

 

8. 모니터링 — HikariCP Metrics

Spring Actuator를 사용하면 HikariCP의 내부 상태를 모니터링할 수 있습니다.


GET /actuator/metrics/hikaricp.connections.active
GET /actuator/metrics/hikaricp.connections.idle

💡 주요 지표:
- active: 현재 사용 중인 커넥션
- idle: 대기 중 커넥션
- pending: 커넥션을 기다리는 요청 수

이 수치를 보면 병목이 풀 크기 문제인지, 쿼리 지연인지 바로 구분할 수 있습니다.

9. 커넥션 풀 튜닝 루틴

실무에서는 다음 루틴으로 주기적인 점검을 권장합니다.

  1. 모니터링 지표 수집 (Active, Idle, Wait)
  2. DB 연결 수 제한과 비교
  3. Peak 트래픽 시 대기 시간 측정
  4. Connection Timeout 발생 여부 확인
  5. max-pool-size 조정 및 재배포

💡 프로 팁: HikariCP는 CPU 성능에 따라 스레드 동기화 방식이 달라집니다. 서버가 다중 코어일수록 효율이 더 높습니다.

마무리

HikariCP는 단순히 “빠른 커넥션 풀”이 아니라, DB 연결의 생명주기를 지능적으로 관리하는 시스템입니다.

잘 튜닝된 커넥션 풀은 서버 안정성과 응답 속도를 동시에 향상시킵니다.

이제 SQL 실행계획으로 병목을 분석하고, HikariCP로 연결 효율까지 확보했습니다.

다음 글에서는 “REST API 설계 원칙 — 효율적인 요청/응답 구조 만들기”를 다루며 웹 서비스 전체 흐름을 최적화하는 단계를 함께 살펴보겠습니다.