공부의 일상

[HikariCP, DBCP] 커넥션 풀 (Connection Pool) 그리고 Hikari?

leeds123 2024. 5. 27. 11:41

HikariCP, DBCP

매번 Spring Boot 프로젝트를 빌드할 때마다 인텔리제이에서 나오는 명령어중에 내 눈에 띄던 것 중하나가 Hikari 이다.
오늘은 이 Hikari가 무엇인지 알아보려한다. (Hikari는 일본어로 '빛'이라고 한다.)

빌드 시 볼 수있는 HikariPool

 

결론부터 말하자면, 먼저 HikariCP는 Connection Pool의 종류 중 1가지 이다.
또한, Spring Boot에서 HikariCP를 볼 수 있었던 이유는
Spring Boot 2.0 이후부터 HikariCP를 기본 DBCP(Connection Pool)로 채택했기 때문이다.

 

Connection Pool 등장 배경

만약 커넥션 풀이 없다면 백엔드 서버는 DB에 데이터를 요청하고 받을때마다 TCP 기반의 Connection을 연결하고 끊을 것이다.
하지만 매번 데이터를 요청할 때마다 TCP 기반의 Connection 이라면 시간적인 비용이 발생할 것이다.
또한, 이런 상황에서 트랙픽도 증가한다면, 시간적 비용이 커져 백엔드 서버 성능에 영향을 미친다.

이러한 이유로 등장한 것이 DBCP (Database Connection Pool) 이다.

 

DBCP

먼저 백엔드 서버는 API 요청을 받기 전 DB와 Connection을 만들어 놓는다.
미리 연결된 Connection을 Pool처럼 관리하는 것이다.

만약 API 요청이 들어오고 데이터베이스에 데이터를 요청해야 한다면, 커넥션 풀에 있는 커넥션 을 사용해 디비와 연결하고,
요청한 데이터를 받은 뒤, 커넥션은 다시 커넥션 풀에 반납한다. 
이러면 커넥션을 재사용 할 수 있고, 커넥션을 열고 닫는 시간을 절약할 수 있다.
이로써 더 빠른 응답을 가능하게 된다.
즉, 미리 커넥션을 만들어 놓고 커넥션을 재사용하는 방식이다.

 

Hikari?

Hikari는 Connection Pooling을 제공하는 JDBC DataSource의 구현체이다.

Hikari 성능 표 + 왜 빠른가?

Hikari 성능 표

 

Hikari의 Connection Pool 관리 방법때문에 빠른 성능을 보인다.

Hikari는 Connection 객체를 PoolEntry로 관리하고, ConcurrentBag이라는 구조체를 사용해 이를 관리한다.
ConcurrentBag은 HikariPool.getConnection() -> ConcurrentBag.borrow()를 통해
사용 가능한 Connection을 리턴한다.
이때, Connection 생성을 요청한 Thread의 정보를 저장해 두고, 만약 다음에 접근한다면, 저장된 정보를 활용해서 빠르게 Connection을 반환한다.

이로써 Hikari는 빠른 성능을 보일 수 있는것이다.