DBCP (Database Connection Pool) 개념과 HikariCP 설정 상세 정리
1. DBCP란?
**DBCP (Database Connection Pool)**는 데이터베이스와의 통신에서 Connection 객체를 매번 생성/해제하지 않고, 재사용을 위한 Pool에 담아 관리하는 기법이다.
이는 DB 연결 시 발생하는 TCP 핸드셰이크 비용, 리소스 소모, 타임아웃 위험을 줄이기 위한 대표적인 방식이다.
2. 기본 개념: TCP 통신과 커넥션 비용
DB 통신은 보통 TCP 기반으로 이루어지며, 아래의 과정이 수반된다.
- Open Connection (3-way-handshake)
클라이언트와 서버가 TCP 연결을 성립하는 과정 - Close Connection (4-way-handshake)
연결을 종료하는 데에도 네 번의 메시지 왕복이 필요
👉 매 요청마다 위 과정을 반복하면 시간적 비용이 크며, 이로 인해 Connection Pool이 탄생했다.
3. HikariCP 주요 설정과 개념
HikariCP는 Spring Boot에서 기본으로 채택하고 있는 가볍고 빠른 DBCP 구현체로, 설정이 간단하고 성능이 우수하다.
✅ minimumIdle
- 설명: 풀에서 유지할 최소 유휴(Connection 미사용) 개수
- 특징: 서버 시작 시 minimumIdle만큼 미리 만들어 놓고 대기시킴
- 주의: maximumPoolSize 제한으로 인해 minimumIdle이 항상 보장되지는 않음
✅ maximumPoolSize
- 설명: 풀에서 동시에 유지할 수 있는 최대 커넥션 수
- 구성: idle + active 포함
- 권장: 실제 요청량과 DB 처리 성능을 고려해 설정
📌 minimumIdle=2, maximumPoolSize=4인 경우
요청 3개가 동시에 들어오면 사용 중 커넥션이 3개가 되며 유휴 커넥션은 1개가 됨.
minimumIdle이 2보다 작아도 maximumPoolSize 제한으로 인해 더 생성되지 않음.
✅ connectionTimeout
- 설명: 풀에서 커넥션을 가져올 때 최대 대기 시간 (ms)
- 기본값: 30초
- 추천: API 응답시간 SLA를 고려하여 1~5초 내외로 설정
✅ maxLifetime
- 설명: 커넥션 객체의 최대 수명 (ms)
- 설정 시간이 초과된 커넥션은, 유휴 상태일 경우 제거됨
- 주의사항:
- 커넥션이 사용 중이면 제거되지 않고 반환 후 제거됨
- MySQL/Oracle 등에서는 DB 서버 측에서 자체적으로 커넥션 수명 제한이 존재
⇒ DB의 wait_timeout보다 몇초 정도 짧게 설정할 것

❗️예: Oracle의 INACTIVE SESSION TIMEOUT이 300초면,
maxLifetime = 295000 (295초) 정도로 설정
4. DB 서버 관련 설정
🔸 max_connections
- 한 DB 인스턴스가 동시에 처리할 수 있는 최대 연결 수
- 커넥션 풀이 늘어나면, DB 성능과 리소스를 고려하여 조정 필요
🔸 wait_timeout
- 비활성(Idle) 커넥션에 대해 서버가 유지할 시간
- 설정된 시간 동안 아무 동작도 없으면 커넥션은 자동 종료됨
❗️ HikariCP의 maxLifetime은 DB의 wait_timeout보다 짧게 설정해야 함.
그렇지 않으면 pool에는 살아있지만 DB는 끊긴 커넥션이 존재하게 되어 예외 발생
5. 추천 기본 설정 예시
spring:
datasource:
hikari:
minimum-idle: 5
maximum-pool-size: 10
idle-timeout: 60000 # 1분
max-lifetime: 270000 # 4.5분
connection-timeout: 5000 # 5초
6. 실무 시사점 및 트러블슈팅
| 문제 상황 | 원인 | 해결 |
| 커넥션 풀 고갈 | maximumPoolSize가 부족 | 요청 패턴 분석 후 풀 크기 조정 |
| 연결 타임아웃 | wait_timeout < maxLifetime | maxLifetime을 더 짧게 조정 |
| 커넥션 반환 안됨 | try-with-resources 미사용 | Connection, Statement, ResultSet 명시적으로 close |
| 유휴 커넥션 과다 | minimumIdle 과다 설정 | 요청량에 맞게 줄이기 |
마무리
DBCP는 단순히 커넥션 재활용을 넘어서 성능과 안정성 확보의 핵심 요소다.
특히 대규모 트래픽을 처리하거나 TPS가 높은 서비스에서는, 풀의 크기, 타임아웃, 수명 관리가 병목과 장애를 좌우할 수 있다.
설정값 하나하나가 서버 자원과 DB 부하, 사용자 응답속도, 장애 처리 가능성에 영향을 준다는 점을 항상 염두에 두자.
다음 글에서는 적절한 connection 수 찾는 과정에 대해 다뤄 보려고한다.
'CS지식 > 데이터베이스 (Database)' 카테고리의 다른 글
| (데이터베이스) 실전에서의 DBCP 설정 최적화: 병목 분석까지 (1) | 2025.05.30 |
|---|---|
| (데이터베이스) DBCP 왜 쓸까? 안쓰면 뭐가 안좋아질까? + DBCP 관련 정리 (0) | 2025.05.30 |
| (데이터베이스) 파티셔닝(Partitioning),샤딩(Sharding),레플리케이션(Replication) (0) | 2025.05.29 |
| (데이터베이스) 인덱스(Index) 개념 정리 (Oracle 중심) (1) | 2025.05.29 |
| (데이터베이스) 정규화 (Database Normalization) *쉬운 예제 (1) | 2025.05.27 |