한양과학기술고등학교

에듀테크 프로젝트 대시보드

커넥션 풀링

데이터베이스 연결 하나를 새로 맺을 때마다 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
파라미터의미
pool_size항상 열어두고 재사용하는 기본 연결 개수
max_overflow순간적으로 몰릴 때 pool_size를 넘어 임시로 더 만드는 최대 개수
pool_timeout빈 연결이 없을 때 대기 큐에서 기다리는 최대 시간
pool_recycle너무 오래된 연결을 끊고 새로 만드는 주기 (DB/방화벽의 idle 종료 대비)