-
서버 장애의 80%는 여기서 시작된다? 커넥션 풀(Connection Pool) 최적화 가이드 🌊Computer Science/Database 2026. 1. 20. 18:00
안녕하세요! 5년 차 주니어 개발자입니다. 오늘은 백엔드 성능의 핵심 보루, **커넥션 풀(Connection Pool, CP)**에 대해 깊이 있게 다뤄보려 합니다.
"사용자가 많아지면 무조건 풀 크기를 늘리면 될까?" "언제 풀이 부족하다는 걸 알 수 있을까?" 실무에서 마주하는 이 질문들에 대해 명쾌한 해답과 모니터링 노하우를 공유합니다! 🚀
1. 커넥션 풀(Connection Pool)이란? 🏊♂️
DB 커넥션 풀은 미리 일정한 수의 **데이터베이스 연결(Connection)**을 만들어 '풀(Pool)' 속에 보관해 두었다가, 요청이 올 때마다 빌려주고 반납받는 방식입니다.
왜 직접 연결하지 않고 '풀'을 사용하나요? (Why?)
DB와 매번 새로 연결하는 작업(TCP 3-way handshake 등)은 비용이 매우 비쌉니다.
- 시간 절약: 미리 연결된 객체를 사용하여 응답 속도를 높입니다.
- 자원 보호: 무한정 연결이 생기는 것을 방지하여 DB 서버의 부하를 조절합니다.
2. 실전! 커넥션 풀을 언제 늘리고 줄여야 할까? 🔍
설정값보다 중요한 것이 현재 상태를 확인하는 방법입니다. 서비스 모니터링(Grafana, CloudWatch 등) 시 다음 지표를 유심히 보세요.
✅ 이런 상황엔 "늘려야 합니다" (Scale-Up)
- Connection Wait Time 증가: 클라이언트가 커넥션을 빌리기 위해 대기하는 시간이 길어진다면, 현재 풀이 모든 요청을 소화하지 못하고 있다는 뜻입니다.
- Pool Usage(사용률)가 90% 이상: 피크 타임에 사용률이 지속적으로 높다면 여유분을 확보해야 합니다.
- Active Connections vs Pending Threads: 활성 커넥션은 꽉 찼는데, 커넥션을 기다리는 스레드(Pending)가 쌓이고 있다면 증설이 필요합니다.
✅ 이런 상황엔 "줄여야 합니다" (Scale-Down)
- DB 서버 CPU/Memory 부하: WAS는 멀쩡한데 DB 서버의 CPU 사용률이 너무 높다면, 너무 많은 커넥션이 Context Switching을 일으키고 있을 확률이 큽니다.
- Idle Connections 과다: 평소에 사용되지 않고 노는 커넥션이 너무 많다면 메모리 낭비입니다.
- Deadlock 발생 빈도 증가: 커넥션이 너무 많으면 트랜잭션 간 경합이 심해져 데드락이 더 자주 발생할 수 있습니다.
3. 주니어 개발자가 흔히 하는 착각: "많을수록 좋다?" ❌
"차선이 많으면 무조건 차가 안 밀리겠지?"라고 생각하기 쉽지만, DB는 그렇지 않습니다.
💡 HikariCP 공식 가이드의 권장 공식
가장 널리 쓰이는 커넥션 풀 라이브러리인 HikariCP는 아래와 같은 공식을 제안합니다.
$$connections = ((core\\_count * 2) + effective\\_spindle\\_count)$$- 핵심: DB 서버의 CPU 코어 수에 맞춰 적절한 제한을 두는 것이, 무작정 늘리는 것보다 훨씬 빠릅니다.
4. 실무에서 바로 써먹는 설정 튜닝 포인트 🛠️
# Spring Boot application.yml 예시 spring: datasource: hikari: maximum-pool-size: 20 # 부하 테스트를 통해 결정 (보통 10~50 사이) minimum-idle: 20 # maximum-pool-size와 동일하게 설정 권장 connection-timeout: 3000 # 3초 이상 대기 시 에러 (사용자 경험 보호) max-lifetime: 1800000 # DB의 wait_timeout보다 무조건 2~3분 짧게!프로젝트 설정 파일(application.yml)에 적용할 핵심 파라미터입니다.
- maximum-pool-size: 최대 풀 크기. 보통 10~50 사이에서 부하 테스트 후 결정합니다.
- minimum-idle: 최소 유휴 연결 수. 성능을 위해 maximum-pool-size와 동일하게 맞추는 것을 권장합니다.
- connection-timeout: 커넥션 획득 대기 시간. 보통 3000ms(3초) 내외로 설정합니다.
- max-lifetime: 커넥션 최대 수명. DB의 wait_timeout보다 무조건 2~3분 짧게 설정하는 것이 장애 방지의 핵심입니다.
5. 요약 및 마무리 📝
커넥션 풀은 서버의 '호흡기'와 같습니다. 단순히 값을 크게 잡는 것이 아니라, 모니터링 지표를 바탕으로 우리 서비스에 맞는 최적의 값을 찾아가야 합니다.
한 줄 요약
"커넥션 풀 튜닝의 핵심은 모니터링 지표를 바탕으로 DB 서버가 감당할 수 있는 최적의 '한계치'를 찾는 것이다." 🚀
함께 보면 좋은 글 🔗
- [Database] 인덱스 설정 하나로 쿼리 속도 10배 높이기
- [Java] HikariCP 내부 동작 원리 깊이 파헤치기
- [Infra] nGrinder를 이용한 API 부하 테스트 실습
📚 출처 및 참고 자료
- HikariCP Wiki: About Pool Sizing
- Baeldung: A Guide to HikariCP
- MySQL Docs: How MySQL Handles Client Connections
- Oracle Blog: Real World Connection Pool Sizing
'Computer Science > Database' 카테고리의 다른 글
Engine=InnoDB는 뭘 지정해주는 걸까 - MySQL 엔진과 스토리지 엔진 (0) 2023.07.09 동시성 제어 메커니즘 - 낙관적 락, 비관적 락 (400) 2021.12.07 DB의 비정상 수행을 유발하는 SQL Injection을 예방하기 (432) 2021.10.31 TCL(Transaction Control Language) in MySQL (421) 2021.09.17 데이터의 효율적 검색을 돕는 Index (442) 2021.07.10