Skip to content

Connection Pool

데이터베이스와 애플리케이션의 성능을 최적화하기 위해, 미리 일정 수의 DB 커넥션(Connection)을 생성해 두고 이를 재사용하는 기법.

1. 왜 필요한가? (문제점)

웹 애플리케이션에서 클라이언트의 요청이 올 때마다 DB와 새로운 연결을 맺고 끊는 과정(TCP/IP 3-Way Handshake, 보안 인증 및 세션 생성 등)은 매우 큰 비용(네트워크 오버헤드)을 소모한다. 만약 동시 접속자가 많아질 경우, 매번 커넥션을 생성하면 응답 시간이 기하급수적으로 느려지고 DB 서버에 과부하가 걸려 서비스 장애로 이어질 수 있다.

2. 동작 방식

  1. 애플리케이션 시작 시, 지정된 설정(Min/Max 개수)에 따라 커넥션 풀(Connection Pool)에 DB 커넥션 객체들을 미리 생성해 둔다.
  2. 클라이언트(스레드) 요청이 들어오면, 풀에서 유휴 상태(Idle)인 커넥션을 하나 빌려준다.
  3. 쿼리 실행이 끝나면, 커넥션을 종료(Close)하지 않고 다시 커넥션 풀에 반환(Return)하여 다음 요청에 대비한다.
  4. 만약 풀에 남은 유휴 커넥션이 없고 최대 생성 개수를 초과했다면, 클라이언트는 커넥션이 반환될 때까지 대기(Wait)하거나 설정된 대기 시간이 지나면 타임아웃 오류(Timeout Exception)를 받게 된다.

3. 장점

  • 성능 향상 (빠른 응답): 커넥션을 맺고 끊는 오버헤드가 사라져 쿼리 실행 속도가 빨라진다.
  • 자원 관리 및 보호: 한 번에 유지되는 커넥션의 최대 수를 제한하여, DB 서버에 무한정 연결이 생성되는 것을 막고 시스템 자원을 효율적으로 관리할 수 있다.

4. 주요 설정 파라미터 및 주의점

  • Minimum Idle: 풀에 유지할 최소 유휴 커넥션 수.
  • Maximum Pool Size: 풀이 최대로 생성할 수 있는 커넥션 수.
  • Connection Timeout: 풀에서 커넥션을 얻기 위해 대기하는 최대 시간.

[주의점] 풀 사이즈(Max Pool Size)를 무조건 크게 잡는다고 성능이 좋아지지 않는다. 커넥션이 많아지면 DB 서버의 메모리와 CPU(Context Switching) 부하가 증가하므로, 데이터베이스 서버의 스펙과 트래픽 양을 고려해 적절한 크기(보통 코어 수에 비례하여 설정)로 튜닝하는 것이 중요하다. (대표적인 라이브러리: Java의 HikariCP)