CS지식/데이터베이스 (Database)

(데이터베이스) DBCP (Database Connection Pool) 정리

불광동 물주먹 2025. 5. 30. 00:31

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 수 찾는 과정에 대해 다뤄 보려고한다.

 

https://moon-97.tistory.com/123