왜 풀(Pool)이 필요한가
「getConnection()」 한 번에 일어나는 일:
매 요청마다 이 과정 → 응답 시간이 0.1초 → 1초로. 동시 사용자 100 명이면 — 시스템 마비.
주방에서 「칼을 매번 깎지 말고 미리 칼통에 모아두자」 의 발상. DB 연결도 미리 N 개 만들어두고 — 필요할 때 꺼내 쓰고 반납.
HikariCP = 가장 빠른 자바 커넥션 풀로 알려진 라이브러리. Spring Boot 의 기본 풀.
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/spring_db?characterEncoding=UTF-8&serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="1234" />
<property name="maximumPoolSize" value="10" />
<property name="connectionTimeout" value="30000" />
<property name="idleTimeout" value="600000" />
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
| 옵션 | 의미 | 기본/권장 |
|---|---|---|
| maximumPoolSize | 최대 연결 수 | 10 |
| minimumIdle | 최소 유휴 연결 수 | 10 (max 와 같게 권장) |
| connectionTimeout | 연결 대기 시간 | 30000 (30초) |
| idleTimeout | 유휴 연결 유지 시간 | 600000 (10분) |
| maxLifetime | 연결의 최대 수명 | 1800000 (30분) |
너무 작으면 — 요청이 풀 대기 큐에서 기다림.
너무 크면 — DB 가 부담.
실무 공식 (HikariCP 권장): (코어 수 × 2) + 1 정도부터 시작.
동시 요청 > maximumPoolSize 면 — 추가 요청은 connectionTimeout 만큼 기다림. 그래도 못 받으면 예외.
SQLTransientConnectionException: Connection is not available
원인:
<property name="leakDetectionThreshold" value="60000" />
<!-- 60 초 이상 연결을 잡고 있으면 경고 로그 -->
👉 개발 단계에서 켜두면 — 「연결을 닫지 않은 코드」 를 잡아낼 수 있음.
| 풀 | 특징 |
|---|---|
| HikariCP | 빠름. 본 과정 + Spring Boot 기본 ⭐ |
| Apache Commons DBCP | 전통적. 기능 많음 |
| C3P0 | 옛날 기본. 지금은 거의 안 씀 |
| Tomcat JDBC Pool | Tomcat 내장 |
DataSource 가 무엇인지 막연.
커넥션 풀의 의미와 효과를 안다. HikariCP 의 주요 옵션을 안다.