본문 바로가기
database

🔧 커넥션 풀 튜닝 전략 – 성능 병목을 잡는 핵심 포인트

by 죄니안죄니 2025. 4. 6.

✅ 왜 커넥션 풀이 중요한가?

웹 애플리케이션은 데이터베이스와 끊임없이 통신합니다.
하지만 DB 연결(Connection)은 매우 비싼 리소스입니다.
매 요청마다 새로 연결하면 성능 저하와 시스템 과부하가 발생하죠.

그래서 등장한 것이 바로 커넥션 풀(Connection Pool) 입니다.
커넥션을 미리 만들어 풀(pool)로 보관하고, 필요할 때 재사용하는 구조로,
DB 연결 비용을 최소화하면서 성능을 끌어올릴 수 있습니다.


🧩 커넥션 풀의 구조와 작동 방식

커넥션 풀은 다음과 같은 방식으로 동작합니다:

  1. 애플리케이션 시작 시, 일정 개수의 DB 커넥션을 생성해 풀에 보관합니다. ( idleTimeout, maxLifetime, validation failure 만족 시 히카리가 해당 세션을 종료시킴. 그 전까지는 재사용)
  2. 사용자가 요청을 보내면, 풀에서 커넥션을 하나 꺼내어 처리합니다.(유휴커넥션이 다 죽은 경우 사용자가 다시 커넥션 요청하면 다시 세션 자동 생성)
  3. 처리가 끝나면 커넥션을 반환하여 재사용합니다.
  4. 동시에 요청이 몰리면, 풀에서 꺼낼 수 있는 커넥션이 부족해질 수 있으며, 이 경우 대기 상태가 발생합니다.
-- 애플리케이션 구동 직후 세션상태정보를 확인 할 수 있다.
SELECT sid, status, machine
FROM v$session
WHERE username = 'MY_APP_USER';

-- MySQL은 information_schema.PROCESSLIST 또는 SHOW PROCESSLIST 사용

💡 커넥션을 반환하지 않으면 풀 고갈이 발생합니다. 이는 전체 시스템 지연의 원인이 됩니다.

 


⚙️ 커넥션 풀 설정 – 꼭 알아야 할 3대 항목

1. 최대 풀 사이즈 (maximumPoolSize)

  • 동시에 사용할 수 있는 커넥션 수의 상한선
  • 너무 작으면 대기 시간이 늘고, 너무 크면 DB 자원 고갈 위험
  • 권장 기준: CPU 코어 수 × 2~4, 또는 TPS 기반 계산

2. 최소 유휴 커넥션 수 (minimumIdle)

  • 시스템이 놀고 있을 때도 유지할 커넥션 수
  • 초기 요청에 대응할 수 있게 미리 준비된 커넥션

3. 커넥션 대기 시간 (connectionTimeout)

  • 커넥션을 풀에서 꺼낼 수 없을 때 대기할 최대 시간 (밀리초)
  • 이 시간을 초과하면 예외 발생 → TimeoutException
항목예시 값
maximumPoolSize   20
minimumIdle 자원을 아끼려면 0으로 할 수 있겠지만 실시간 트래픽이 있는 서비스에서는 최소 수준은 유지해야 서비스가 느려지지 않음 5
connectionTimeout   3000 (3초)
idleTimeout 유휴 상태로 컨넥션이 살아있는 시간. 이 시간이 지나면 제거됨 600000 (10분)
maxLifetime   1800000 (30분)

curl http://localhost:8080/actuator/metrics/hikaricp.connections ( 실시간 확인 - Spring Boot Actuator + Hikari)

idle = 0 이면 유휴 커넥션이 하나도 없는 상태


🔍 주요 커넥션 풀 라이브러리 비교: HikariCP vs DBCP vs UCP

항목HikariCPDBCPUCP (Oracle)
성능 🔥 매우 빠름 보통 빠름
Spring 기본 ✅ 내장됨
커스터마이징 높음 낮음 Oracle 특화
모니터링 지원 JMX, Micrometer 제한적 Oracle EM
사용 대상 Spring Boot, 일반 Java 레거시 환경 Oracle 제품군

Spring Boot 환경이라면 HikariCP가 기본이며, 성능과 안정성 모두 뛰어납니다.


🚨 커넥션 풀 고갈 방지 전략

✔️ 커넥션 반환 철저

  • 커넥션을 반납하지 않으면 풀 고갈 발생
  • try-with-resources 또는 finally 블록 사용 권장
    try (Connection conn = dataSource.getConnection()) {
        // DB 작업 수행
    } catch (Exception e) {
        // 예외 처리
    }

 

 

✔️ 느린 쿼리 줄이기

  • 한 커넥션을 오래 점유하면 풀 회전율이 떨어짐
  • 느린 쿼리는 튜닝하거나 캐시 활용
  • 예: 자주 조회하는 마스터 데이터 → Redis 캐싱

✔️ TPS 기준 풀 크기 계산

  • 예: 초당 요청 100건, 평균 처리 시간 0.2초라면
    → 100 * 0.2 = 20개의 커넥션이 필요

✔️ 모니터링 도입

  • Spring Actuator + Micrometer + Prometheus + Grafana
  • 커넥션 사용량, 대기 시간, 실패율 등을 시각화하여 실시간 대응

🧪 실전 예시: Spring Boot + HikariCP 설정 (application.yml)

spring:
  datasource:
    url: jdbc:mysql://db-host:3306/mydb
    username: user
    password: pass
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 3000
      idle-timeout: 600000
      max-lifetime: 1800000
 

✅ 마무리 요약

  • 커넥션 풀은 DB 성능 최적화의 핵심 요소
  • 무작정 큰 풀은 오히려 오버헤드 → 시스템 리소스와 TPS를 기준으로 설정
  • HikariCP 사용 권장, 반환 철저, 쿼리 최적화, 모니터링 도입이 중요

다음 글에서는 👉 DB 세션 모니터링 방법 을 실습 중심으로 다룹니다.

커넥션풀 라이브러리

댓글