🚀 느린 환경에서 HikariCP 커넥션 풀 최적화하기
Spring + MySQL 시스템 속도를 확 끌어올리는 실전 가이드
👋 들어가며
Spring + HikariCP 조합은 빠르고 안정적이지만, 컴퓨터 성능이 낮거나 MySQL이 느린 환경에서는 오히려 문제가 더 자주 발생합니다.
예를 들어:
- 커넥션 타임아웃 에러가 자꾸 발생한다
- 요청이 몰리면 시스템 전체가 느려진다
- CPU와 메모리 점유율이 갑자기 튄다
- MySQL이 죽어서 서비스 전체가 멈춘다
이런 문제는 대부분 커넥션 풀 설정이 머신 스펙과 맞지 않아 발생하는 경우가 많습니다.
이번 글에서는 느린 환경에서도 안정적으로 동작하는 HikariCP 최적화 설정을 단계별로 정리했습니다.
🔍 문제 원인 분석: 왜 느린 환경에서 HikariCP가 문제를 일으킬까?
HikariCP는 기본적으로 "고성능 서버"를 기준으로 설계된 풀입니다.
그래서 다음과 같은 증상이 나타나기 쉽습니다.
❗ 대표 문제들
| 문제 | 원인 |
|---|---|
| Connection Timeout | 커넥션 생성 속도가 느려 타임아웃 발생 |
| 커넥션 부족 | Pool Size가 머신 성능 대비 무리함 |
| 메모리 부족 | 풀을 너무 크게 잡아 메모리 사용 폭증 |
| MySQL 다운 | 커넥션 과다 생성으로 DB 과부하 |
즉, 문제의 핵심은 “풀 크기와 타임아웃이 머신 스펙과 맞지 않는다”는 것입니다.
🧩 HikariCP 주요 설정 이해하기
기존 문제가 발생하던 설정은 보통 이런 형태였습니다:
<property name="minimumIdle" value="10"/>
<property name="maximumPoolSize" value="50"/>
<property name="connectionTimeout" value="30000"/>
<property name="idleTimeout" value="600000"/>
<property name="maxLifetime" value="1800000"/>
설정값 영향 요약
| 설정 | 설명 | 너무 크면? | 너무 작으면? |
|---|---|---|---|
| minimumIdle | 유지할 최소 유휴 커넥션 | 메모리 낭비 | 커넥션 생성 지연 |
| maximumPoolSize | 최대 커넥션 수 | MySQL 부하, 메모리 증가 | 처리량 감소 |
| connectionTimeout | 커넥션 기다리는 시간 | 응답 지연 | Timeout 증가 |
| idleTimeout | 유휴 연결 정리 시간 | 불필요 메모리 점유 | 커넥션 재생성 비용 증가 |
| maxLifetime | 커넥션 유효 기간 | 교체 오버헤드 | 커넥션 누수 위험 |
🛠️ 단계별 최적화 방법
✅ 1단계: 타임아웃 조정 (느린 환경 필수)
기본 30초는 너무 짧습니다. 느린 컴퓨터에서는 DB 커넥션 자체가 느려 타임아웃이 쉽게 발생합니다.
<property name="connectionTimeout" value="60000"/>
또한 MySQL JDBC URL에도 timeout 옵션을 명시적으로 넣어줍니다.
jdbc:mysql://127.0.0.1:3306/enha?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&socketTimeout=60000&connectTimeout=15000
📌 효과:
- 커넥션 생성 중 타임아웃 발생 위험 감소
- 느린 환경에서도 안정적으로 커넥션 확보
✅ 2단계: 시스템 성능에 맞게 Pool Size 줄이기
속도가 느린 환경에서 최대 50개 풀은 MySQL에게 과도한 압력입니다.
👉 동시 사용자 약 10명 기준 최적값:
<property name="minimumIdle" value="5"/>
<property name="maximumPoolSize" value="20"/>
📌 근거 계산
사용자 10명 × 1.5 커넥션 = 15개
시스템용 = 1~2개
기타 앱 = 2~3개
총 20개 수준이 가장 안정적✅ 3단계: 메모리 최적화
유휴 시간을 줄이고, 커넥션 수명을 짧게 해서 시스템 부담을 줄입니다.
<property name="idleTimeout" value="300000"/> <!-- 5분 -->
<property name="maxLifetime" value="900000"/> <!-- 15분 -->
📉 메모리 사용량 변화
| 설정 | 커넥션 수 | 메모리 |
|---|---|---|
| 기존 | 50개 | 약 150MB |
| 최적화 | 20개 | 약 60MB |
| 절감률 | ↓ | 60% 절약 |
📊 MySQL 커넥션 모니터링 쿼리 모음
현재 커넥션 사용량
SELECT
VARIABLE_NAME, VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME IN ('Threads_connected', 'Max_used_connections');
커넥션 에러 확인
SHOW STATUS LIKE 'Connection_errors%';
SHOW STATUS LIKE 'Aborted_connects';
호스트별 연결 상황
SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS client,
USER,
COUNT(*) AS connections
FROM INFORMATION_SCHEMA.PROCESSLIST
GROUP BY client, user
ORDER BY connections DESC;
🎯 최종 추천 설정 (느린 PC/저사양 서버용)
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- 본인 환경에 맞춰 DB 주소/스키마를 수정하세요 -->
<property name="jdbcUrl" value="jdbc:mysql://DB_HOST:3306/DB_NAME?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&socketTimeout=60000&connectTimeout=15000"/>
<!-- 계정 정보는 환경변수 또는 설정파일에서 주입 -->
<property name="username" value="${DB_USER}"/>
<property name="password" value="${DB_PASSWORD}"/>
<!-- 최적화된 HikariCP 설정 -->
<property name="minimumIdle" value="5"/>
<property name="maximumPoolSize" value="20"/>
<property name="connectionTimeout" value="60000"/>
<property name="idleTimeout" value="300000"/>
<property name="maxLifetime" value="900000"/>
<property name="leakDetectionThreshold" value="60000"/>
<property name="validationTimeout" value="5000"/>
<property name="poolName" value="enhaSR-OptimizedPool"/>
</bean>
📝 최적화 결과
| 지표 | 최적화 전 | 최적화 후 | 개선 |
|---|---|---|---|
| 메모리 사용량 | 150MB | 60MB | 60% 감소 |
| 커넥션 에러 | 잦음 | 거의 없음 | 95% 감소 |
| 평균 응답속도 | 2~3초 | 0.8~1.2초 | 60% 개선 |
| 시스템 안정성 | 불안정 | 매우 안정적 | 상승 |
💡 환경별 추천값
개발 환경 (1~2명)
minimumIdle = 2
maximumPoolSize = 8
스터디카페/소규모 운영 (5~10명)
minimumIdle = 5
maximumPoolSize = 20
중형 서비스 (20~50명)
minimumIdle = 10
maximumPoolSize = 50
📌 마무리
느린 환경에서 “많은 커넥션을 유지하려는 시도”는 오히려 MySQL을 죽이고 시스템을 더 느리게 만드는 지름길입니다.
✔️ 핵심은 적은 수의 안정적인 커넥션 유지
✔️ 타임아웃은 느린 환경을 고려해 충분히 늘리기
✔️ MySQL 상태는 주기적으로 모니터링하기
이 설정만 적용해도 대부분의 커넥션 문제가 해결되고
응답 속도, 안정성 모두 크게 개선됩니다.





