데이터베이스 연결 하나를 새로 맺을 때마다 TCP 3-way handshake,
(필요하다면) TLS 협상, 로그인 인증이 매번 반복된다.
요청마다 이 과정을 새로 하면 수십 ms가 그대로 낭비된다.
커넥션 풀(Connection Pool)은 연결을 미리 여러 개 만들어두고
요청이 올 때마다 빌려주고(acquire) 다시 돌려받는(release) 방식으로 이 비용을 없앤다.
풀에 남는 연결이 없으면 요청은 대기 큐(wait queue)에서 기다리다가,
너무 오래 기다리면 타임아웃으로 실패한다.
❌ 풀 없이 매번 새 연결
요청 1개마다 은행 창구를 새로 짓는 것과 같다.
건물(TCP 핸드셰이크) → 직원 채용(인증)을 매번 반복하고
상담 한 번 끝나면 건물을 부순다. 느리고 서버 자원도 낭비된다.
✅ 커넥션 풀 사용
미리 창구 N개를 열어두고 직원을 배치해둔다.
손님(요청)은 비어있는 창구에 바로 앉고, 상담이 끝나면
직원은 그대로 남아 다음 손님을 받는다. 창구가 꽉 차면 대기줄에 선다.
🔌 풀 시뮬레이터 LIVE
풀 상태 (초록=idle, 빨강=busy)
대기 큐 (wait queue)
대기 중인 요청 없음
0
처리 완료
0
대기 중
0
타임아웃 실패
0 ms
평균 대기시간
📋 서버 로그
// 풀 초기화 완료. 요청을 보내보세요...
🐍 SQLAlchemy 풀 설정 예시 main.py
from sqlalchemy import create_engine
engine = create_engine(
"postgresql://user:pw@localhost/db",
pool_size=5, # 상시 유지하는 연결 수
max_overflow=10, # 풀 초과 시 추가로 허용하는 임시 연결 수
pool_timeout=30, # 빈 연결을 이 시간(초)만큼 기다림
pool_recycle=1800, # 오래된 연결을 주기적으로 재생성 (idle timeout 방지)
)
# 풀이 pool_size + max_overflow 만큼 다 차면:# sqlalchemy.exc.TimeoutError: QueuePool limit of size 5# overflow 10 reached, connection timed out, timeout 30