개발놀이터

커넥션 풀 (Connection Pool) 본문

CS 지식/데이터베이스

커넥션 풀 (Connection Pool)

마늘냄새폴폴 2023. 2. 27. 13:02

이번 포스팅에서는 커넥션 풀에 대해서 알아보도록 하겠습니다. 

 

커넥션 풀링은 데이터 접근 패턴으로 많이 알려져있습니다. 커넥션 풀링은 데이터베이스 커넥션과 읽고/쓰는 데이터베이스 작업 성능을 포함되는 과부하를 줄이기위한 목적으로 사용됩니다. 

 

기본적인 레벨에서 커넥션 풀은 데이터베이스 커넥션 캐싱 구현체입니다. 이것은 개발자들의 특별한 요구를 적절하게 구성할 수 있습니다. 

 

커넥션 풀

왜 커넥션 풀을 사용해야 할까요? 

 

이 질문에 대한 답을 얻기 위해서는 데이터베이스가 커넥션 작업을 하는 동안 벌어지는 일에 대해서 알면 답할 수 있습니다. 

 

데이터베이스 커넥션은

 

  1. 데이터베이스 드라이버를 사용해서 커넥션을 엽니다. 
  2. 읽기/쓰기에 의해 생성된 데이터를 위해 TCP 소켓을 엽니다.
  3. 읽기/쓰기에 의해 생성된 데이터를 소켓에 담습니다.
  4. 케녁선을 닫습니다.
  5. 소켓을 닫습니다.

 

이 작업만 놓고 봤을 때 데이터베이스 커넥션을 얻기 위해 굉장히 많은 작업이 필요한 것을 알 수 있습니다. 이리헌 작업이니만큼 데이터베이스 커넥션을 위해 과정을 최소화하는 것은 필수적으로 보이죠. 

 

https://velog.io/@mstar228/Connection-Pool%EC%9D%B4%EB%9E%80

 

 

커넥션 풀의 특징

커넥션 풀의 특징으로는 다음과 같습니다.

  • WAS가 실행되면서 커넥션 객체들을 미리 풀에 생성해 둡니다.
  • HTTP 요청에 따라 풀에서 커넥션 객체를 가져다 쓰고 반환합니다.
  • 이와 같은 방식으로 물리적인 데이터베이스 연결 부하를 줄이고 연결 관리를 합니다.
  • 풀에 미리 커넥션 객체가 생성되어 있기 때문에 커넥션을 생성하는데 드는 요청마다 연결 시간이 소비되지 않습니다.
  • 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정할 수 있습니다.

 

동시 접속자가 많을 경우

동시 접속자가 많을 경우 풀에서 미리 생성된 커넥션을 제공하고, 없을 경우에는 사용자는 커넥션이 반환될 때까지 번호순서대로 대기상태로 기다립니다. 

 

여기서 WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간이 줄어들고, 반대로 커넥션 풀을 적게 설정하면 그만큼 대기시간이 길어진다. 

 

 

Hikari Connection Pool

다양한 커넥션 풀이 사용되지만 그 중에서도 가장 뛰어난 성능을 보여주는 Hikari(이하 히카리) 커넥션 풀에 대해서 잠깐 알아보도록 하겠습니다. 

 

히카리CP는 가장 가볍고 가장 빠른 JDBC 커넥션 풀링 프레임워크입니다. 

 

얼마나 빠르고 어떻게 이런 성능을 보여주는걸까요?

 

아래 표는 히라키CP와 다른 커넥션 풀링 프레임워크와 비교한 데이터입니다. 

 

히카리CP에서 낸 공식적인 벤치마크이긴 하지만 보통 본인회사 본인제품을 홍보할 때는 과장이 어느정도 있으니 그런것들을 염두에 두고 판단하시면 될 것같습니다. 

 

히카리CP가 이런 성능을 낼 수 있는 것에는 아래와 같은 이유때문입니다.

 

  1. 바이트코드 레벨의 엔지니어링 : 몇몇개의 극도로 바이트코드 레벨로 엔지니어링 된 것이 그 첫번째 이유입니다. 극도로 바이트코드 레벨로 엔지니어링 되었다는 의미는 어셈브리코드 레벨의 코딩을 의미합니다.
  2. 미세한 부분까지 최적화 : 비록 정확히 측정할 수는 없을지라도 전체적인 성능에서 성능최적화를 구현해내고 있습니다.
  3. 컬렉션 프레임워크를 효율적으로 사용 : 히카리CP에서는 ArrayList<E>를 커스텀 클래스로 대체해서 사용하고 있습니다. FastList인데요, range checking을 제거했고 처음부터 끝까지 스캔하는 것을 제거했습니다. 

이렇기 때문에 히카리CP는 많은 프레임워크에서 디폴트 커넥션 풀로 사용할만큼 잘 만들어진 프레임워크입니다. 

 

 

여기까지 커넥션 풀에 대해서 알아봤습니다. 딱히 어려운 내용이 없어서 이번 포스팅을 준비하는데 어려움은 없었던 것 같네요 제 포스팅이 많은 도움이 되셨기를 기원하면서 이만 마치도록 하겠습니다. 오늘도 즐거운 하루 되세요~

 

 

출처

https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/

 

[Spring] 커넥션 풀(Connection pool)이란?

커넥션 풀(Connection pool)에 대해서 그래도 알고 사용하자. 쉽게 알고 갔으면 좋겠습니다.

linked2ev.github.io

https://www.baeldung.com/java-connection-pooling

=> 커넥션 풀 공식문서

https://www.baeldung.com/hikaricp

=> 히카리CP 공식문서