커넥션 풀(Conncetion Pool)란?
웹 애플리케이션과 같은 다중 사용자 환경에서 데이터베이스 연결을 효율적으로 관리하기 위해 사용된다.
클라이언트와 서버 사이드인 웹 어플리케이션에서 데이터베이스 연결을 위해 미리 일정수의 Connection 객체를 만들어 Pool에 담아 둔다. 추후 사용자의 요청이 발생하면 Pool에서 생성되어 있는 Connection 객체를 넘겨주고 처리가 끝나면, 실행된 상태로 Connection 객체를 다시 Pool에 반환하여 보관하는 기법이다.

정리하자면,
- 사전에 일정 수의 Connection 객체를 만들어 Pool에 담는다.
- 요청 발생 시, Pool에 생성된 Connection 객체를 빌려준다.
- 처리가 끝나면, Connection 객체를 다시 Pool에 반환한다.
왜 사용할까?
일반적으로 데이터베이스 연결은 비용이 큰 작업이다. 데이터베이스 서버와의 연결을 맺고 끊는 과정은 시간이 많이 소요되며, 데이터베이스 서버의 리소스도 소비된다. 그렇기 때문에 매번 데이터베이스 연결을 필요로 하는 요청이 발생할 때마다 새로운 연결을 생성하는 것은 효율적이지 않다.
그래서 커넥션 풀(Conncetion Pool)을 이용하면 이와 같은 장점이 있다.
- 성능 개선: 데이터베이스 연결은 비용이 큰 작업이다. 매번 요청이 발생할 때마다 새로운 연결을 생성하는 것은 오버헤드가 크다. 커넥션 풀을 사용하면 미리 일정 수의 연결을 생성해두고, 요청이 발생하면 풀에서 사용 가능한 연결을 제공하여 연결 생성 및 해제에 따른 오버헤드를 줄일 수 있다. 이는 애플리케이션의 응답 시간을 향상시키고, 데이터베이스 서버의 부하를 감소시킨다.
- 확장성: 커넥션 풀은 요청이 증가함에 따라 자동으로 연결을 확장할 수 있다. 즉, 동시에 여러 사용자가 애플리케이션에 접속해도 풀에 미리 생성된 연결을 사용하여 서비스의 안정성을 유지할 수 있다. 필요에 따라 커넥션 풀의 크기를 조정하여 최적의 성능과 확장성을 달성할 수 있다.
- 연결 관리: 커넥션 풀은 연결의 생성, 해제 및 관리를 담당한다. 풀에 미리 생성된 연결을 재사용함으로써 연결의 생성 및 해제 오버헤드를 줄이고, 연결을 효율적으로 관리할 수 있다. 또한, 유휴 연결의 제거나 유효성 검사 등의 기능을 통해 안정적인 연결을 유지할 수 있다.
- 제어 및 구성 가능성: 커넥션 풀은 다양한 설정 옵션을 제공하여 풀의 동작을 조정할 수 있다. 최대 연결 수, 최대 유휴 시간(컴퓨터가 작동 가능한데도 작업을 하지않는 시간), 유효성 검사 등을 설정하여 애플리케이션에 최적화된 커넥션 관리를 할 수 있다.
- 데이터베이스 리소스 관리: 커넥션 풀을 사용하면 데이터베이스 서버에서의 연결 관리를 효율적으로 수행할 수 있다. 연결이 잘 관리되고 재사용되므로 데이터베이스 서버의 리소스를 효율적으로 활용할 수 있다.
💡 그래서 우리는 커넥션 풀 종류 중 하나인 HikariCP을 이용해볼 수 있다.
그 전에 커넥션 풀 종류에 대해 간단하게만 알아보자.
- HikariCP
- HikariCP는 현재 가장 인기 있는 커넥션 풀 중 하나이다.
- 높은 성능과 경량화된 디자인으로 알려져 있으며, 많은 개발자들이 선호한다.
- c3p0:
- Java에서 사용되는 또 다른 유명한 커넥션 풀이다.
- 다양한 설정 옵션과 확장성을 제공하며, 오랜 기간 동안 사용되어 왔다.
- Apache Commons DBCP
- Java 애플리케이션에서 데이터베이스 연결 풀을 구현하기 위해 사용되는 라이브러리
- 안정성과 신뢰성이 검증되어있다.
- Tomcat JDBC Pool
- Apache Tomcat 프로젝트에서 개발된 Tomcat JDBC Pool
- Tomcat 컨테이너와의 통합에 최적화된 커넥션 풀이다.
- Tomcat과 함께 사용할 때 효과적인 성능을 발휘한다.
- Vibur DBCP
- 다중 스레드 환경에서 높은 성능을 발휘하는 자바 커넥션 풀이다.
- 비동기 및 동기 I/O를 효율적으로 처리할 수 있도록 설계되었다.
- Proxoo
- 경량화된 커넥션 풀로 알려져 있다.
- 간단하게 설정 및 사용할 수 있으며, 특히 분산된 환경에서 활용하기 좋다.
각 특징에 따라 골라서 사용하면 좋을 듯 싶다.
HikariCP란?
- Java 애플리케이션에서 데이터베이스 연결 풀링을 위해 사용되는 고성능 커넥션 풀 라이브러리
HikariCP는 대규모 트래픽을 처리하는 데 특화된 경량화된 디자인과 뛰어난 성능을 가지고 있다.

벤치마크 링크
또한, SpringBoot 2.0부터 HikariCP를 기본 데이터 소스로 채택하고 있다. 그래서 간단한 설정만으로 사용할 수 있다.
SpringBoot에서 HikariCP 설정
아까 말했듯이, SpringBoot 2.0 부터 지원을 시작했기 때문에 큰 설정 없이
build.gradle"org.springframework.boot:spring-boot-starter-jdbc" 에 포함 되어 있다.
yml 설정
application.yml
spring:
datasource:
hikari:
connectionTimeout : 30000
maximumPoolSize : 10
maxLifetime : 1800000
poolName : HikariCP
readOnly : false
connectionTestQuery : SELECT 1
- connectionTimeout (default : 30000 (30 초))
- 클라이언트가 Pool에 Connection을 요청하는데 기다리는 최대시간을 설정
- maximunPoolSize (default : 10)
- 유휴 및 사용 중인 Connection을 포함하여 풀에 보관가능한 최대 커넥션 개수를 설정
- minimumIdle (default : maximumPoolSize와 동일)
- Connection Pool에서 유지가능한 최소 커넥션 개수를 설정
- idleTimeout (default : 600000 (10분))
- Connection Pool에서 유휴 상태로 유지시킬 최대 시간을 설정
- maxLifeTime (default : 1800000 (30분))
- Connection의 최대 유지 시간을 설정
- DB의 wait_timeout 보다 2~3초 짧게 할당해야 함
- readOnly (default : false)
- Pool에서 얻은 Connection이 기본적으로 readOnly인지 지정하는 설정
- connectionTestQuery (default : none)
- 데이터베이스 연결이 여전히 활성화 되어 있는지 확인하기 위해 Pool에서 Connection을 제공하기 전에 실행되는 쿼리
위와 같이 기본 설정만으로도 손쉽게 이용이 가능하다.
다음엔 HikariCP 설정 튜닝 관련해서 좀 더 알아보고 정리할 예정이다.