💡 핵심 인사이트
커넥션 풀(Connection Pool)은 웹 서버(WAS)와 데이터베이스 서버 간의 통신에서, 매번 연결을 새로 맺고 끊는 엄청난 비용(시간)을 절약하기 위해, 미리 일정 개수의 '연결선(Connection)'을 맺어두고 웅덩이(Pool)에 담아 재사용하는 기법입니다.
대규모 동시 접속자가 몰리는 현대 웹 애플리케이션의 필수 성능 최적화 기술입니다.


Ⅰ. DB 연결(Connection)의 높은 비용

웹 애플리케이션(예: Spring Boot WAS)이 DB(예: MySQL)에 데이터를 달라고 요청하려면 물리적인 네트워크 연결 과정이 필요합니다.

  1. 3-Way Handshake: TCP/IP 네트워크 소켓 연결 맺기.
  2. 인증(Authentication): DB 계정 아이디와 비밀번호 암호화 및 전송, 권한 검사.
  3. 스레드 할당: DB 서버 내부에서 이 요청을 처리할 전용 스레드(프로세스) 생성.

이 과정은 생각보다 엄청나게 무겁고 오랜 시간(수십~수백 ms)이 걸립니다. 만약 수강신청 기간에 1만 명의 학생이 동시에 버튼을 눌렀을 때, 1만 번의 DB 연결을 새로 맺으려 시도한다면 DB 서버는 연결을 맺다가 CPU가 터져버려 다운(뻗음)됩니다.


Ⅱ. 커넥션 풀(DBCP)의 원리와 장점

**DBCP(Database Connection Pool)**는 이 병목 현상을 해결합니다.

  1. 미리 생성 (Pre-allocation): 웹 서버(WAS)가 구동될 때, DB와 미리 10개~50개 정도의 커넥션을 미리 맺어놓고 풀(수영장) 안에 둥둥 띄워 보관합니다.
  2. 대여 (Borrow): 사용자 요청이 들어오면 DB와 새로 연결을 맺는 것이 아니라, 풀에 미리 만들어져 있던 연결선 하나를 꺼내서(빌려줘서) 0.001초 만에 즉시 SQL 쿼리를 실행합니다.
  3. 반납 (Return): 쿼리 실행이 끝나면 연결을 끊지(Close) 않고, 다시 다음 사람을 위해 풀(수영장) 속으로 반납합니다.

핵심 장점

  • 연결/해제에 드는 오버헤드가 사라져 전체적인 응답 속도가 비약적으로 상승합니다.
  • 동시 접속자가 폭주해도 풀에 설정된 최대 개수(예: max-active 50개)까지만 DB에 접근하므로, DB 서버가 과부하로 죽는 것을 보호(Throttling)하는 방파제 역할을 합니다. (51번째 사용자는 앞사람이 커넥션을 반납할 때까지 큐에서 대기하게 됩니다.)

Ⅲ. 실무적 고려사항 (풀 사이즈 최적화)

"그럼 커넥션을 1,000개쯤 미리 만들어두면 안 되나요?" 안 됩니다. 커넥션을 하나 유지할 때마다 WAS와 DB 양쪽 모두 상당한 메모리를 잡아먹습니다. 풀 사이즈를 너무 크게 잡으면 메모리 부족(OOM)으로 시스템이 죽고, 너무 작게 잡으면 큐에서 대기하는 시간이 길어져 사용자 화면에 무한 로딩이 걸립니다.

  • HikariCP / Tomcat CP: Java 진영에서 가장 널리 쓰이는 빠르고 안정적인 오픈소스 커넥션 풀 라이브러리들입니다. 보통 CPU 코어 수와 쿼리 복잡도를 계산하여 hikari.maximum-pool-size를 적절히 튜닝하는 것이 백엔드 엔지니어의 핵심 역량입니다.

📢 섹션 요약 비유: 커넥션 풀은 유명 놀이공원의 **'렌탈 휠체어 보관소'**입니다. 손님이 올 때마다 공장에 휠체어를 새로 주문 제작(새로운 커넥션 생성)하면 하루 종일 기다려야 합니다. 그래서 아침에 미리 50대의 휠체어를 조립해두고(Pool), 손님이 오면 바로 빌려줬다가 다 쓰면 다시 반납받아 다음 손님에게 주는 효율적인 대여 시스템입니다.