데이터베이스 커넥션풀과 HikariCP

김도현·2023년 6월 30일

데이터베이스 커넥션

데이터베이스 커넥션 풀에 대해 알아보기 이전에 데이터베이스 커넥션이 무엇인지부터 알아보자.
우리가 개발하는 웹 애플리케이션과 데이터베이스는 서로 다른 시스템이다. 따라서 데이터베이스 드라이버를 사용하여 데이터베이스에 연결해야 한다.

데이터베이스 연결의 생애주기는 아래와 같다.

  1. 데이터베이스 드라이버를 사용하여 데이터베이스 연결 열기
  2. 데이터를 읽고 쓰기 위해 TCP 소켓 열기
  3. TCP 소켓을 사용하여 데이터 통신
  4. 데이터베이스 연결 닫기
  5. TCP 소켓 닫기

위와 같이 데이터베이스 연결을 수립하고, 해제하는 과정은 비용이 많이 들어가는 작업이다.

웹 어플리케이션 서버와 데이터베이스와의 통신은 TCP 프로토콜을 사용하여 진행되고 이 통신 과정에서 TCP 소켓은 서버와 클라이언트 간의 접속 지점을 나타낸다.

데이터베이스 커넥션 풀 (DBCP)

사용자로부터 웹 애플리케이션에 요청이 들어올때마다 데이터베이스 연결을 수립하고, 해제하는 것은 굉장히 비효율적으로 보인다. 우리는 어떻게 이런 비효율을 해결할 수 있을까? 미리 여려개의 데이터베이스 커넥션을 생성해놓고, 필요할 때마다 꺼내쓰면 좋지 않을까? 방금 이야기한 방법을 데이터베이스 커넥션 풀(Connection Pool)이라고 한다.

데이터베이스 커넥션 풀을 사요하면 데이터베이스 요청이 들어올 때마다 데이터베이스 연결을 수립하고, 통신한 뒤, 닫는 과정을 거치지 않아도 된다. 데이터베이스 커넥션풀에는 사전에 데이터베이스와 이미 연결이 수립된 다수의 커넥션들이 존재한다. 커넥션 풀 안의 커넥션들은 데이터베이스 요청이 들어올 때마다 새롭게 연결을 수립하고 닫는대신 항상 연결을 열린 상태로 유지한다.

WAS는 데이터베이스 커넥션이 필요할 때 직접 커넥션을 생성하지 않고, 커넥션 풀 컨테이너로부터 컨넥션을 하나 건네받고, 사용을 마치면 반납한다. 이렇게 함으로써 우리는 데이터베이스 연결을 열고, 닫는 비용을 절약할 수 있다.

HikariCP

데이터베이스 커넥션 풀 프레임워크는 대표적으로 Apache Commons DBCP, Tomcat DBCP, HikariCP, Oracle UCP 등이 있다. 이번 포스팅에서는 가장 많이 사용되는 HirariCP에 대해 알아본다.
스프링부트로 개발을 해본 사람이라면, HikariCP가 무엇인지 이름은 들어봤을 것이다.
스프링부트로 만든 애플리케이션을 기동하면 아래와 같은 로그가 출력되기 때문이다.

com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

HikariCP는 스프링부트에 기본으로 내장되어 있는 JDBC 데이터베이스 커넥션 풀링 프레임워크이다. 스프링부트는 HikariCP를 사용할 수 있는 상황에서는 항상 HikariCP를 선택한다고 한다.
HikariCP를 사용할 수 없는 경우 Tomcat DBCP -> Apache Commons DBCP -> Oracle UCP 순으로 선택한다고 한다.

스프링부트는 왜 HikariCP를 기본 내장하고, 최우선으로 선택하는걸까? HikariCP의 성능이 압도적으로 우수하기 때문이다. 아래 그래프는 HikariCP 팀에서 제공한 데이터베이스 커넥션 풀링 프레임워크들의 벤치마크 결과이다.

HikariCP는 바이트코드 수준까지 극단적으로 최적화 되어있다. 또한 미세한 최적화와 Collection 프레임워크를 영리하게 사용한 덕분에 위와 같은 벤치마크 결과가 나올 수 있었다.

참고: https://hudi.blog/dbcp-and-hikaricp/

profile
Just do it

0개의 댓글