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

dev-jjun·2023년 8월 13일
0

Server

목록 보기
24/33
post-thumbnail

DBCP(Database Connection Pool)이란?

최초 Pool 내에서 연결(Connection)들을 하여 HTTP 요청에 따라 응답을 제공하고 반환받으며 이를 재사용하는 것

사용자로부터 웹 애플리케이션에 요청이 들어올 때마다 데이터베이스 연결을 수립하고 해제하는 것은 매우 비효율적이다.

→ 이를 해결하기 위해 등장한 것이 바로 DBCP!

미리 여러 개의 데이터베이스 커넥션을 생성하여 연결해두고, 필요할 때마다 꺼내서 쓰는 방식으로, 매번 DB 요청이 들어올 때마다 새롭게 연결을 하는 것이 아닌 항상 연결을 열린 상태로 유지한다.

여기서 커넥션 풀에 있는 커넥션들은 이미 TCP/IP로 DB와 연결되어 있는 상태를 유지하므로, 언제든지 즉시 SQL을 DB에 전달할 수 있는 것이다.

이는 애플리케이션을 시작하는 시점에 필요한 만큼 미리 확보하여 풀에 보관을 하는데, 이때 크기를 지정해줄 수 있다. (기본값은 10개!)

DBCP의 과정

  1. WAS가 실행되면서 Pool 내에 Connection들을 생성
  2. HTTP의 요청에 따라 Pool 내에서 Connection 객체를 가져가 사용
  3. 사용이 완료된 Connection 객체는 Pool 내에 반환
🤫 커넥션 풀을 이용하지 않고 연결할 때는요?

데이터베이스는 웹 애플리케이션과 분리되어 있기 때문에, 데이터베이스 드라이버를 이용하여 따로 연결해주는 작업이 필요하다.

  1. DB Driver를 사용하여 데이터베이스 연결 Open
  2. 데이터를 읽고 쓰기 위해 TCP 소켓 Open
  3. TCP 소켓을 이용하여 데이터 통신
  4. 데이터베이스 연결 Close
  5. TCP 소켓 Close

→ 이것이 바로 데이터베이스 연결의 lifecycle 이다.

DBCP의 장점

  1. WAS와 데이터베이스와의 연결(Connection)을 줄임으로써 비용 절감

  2. Pool 내에 미리 연결되어 있기 때문에 매번 생성하지 않아도 OK

  3. Connection에 대한 조정 가능 인프라의 DB Connection 수도 함께 고려해야 함

    *Connection Pool의 크기 설정

    • 大? 메모리 소모가 큰 대신, 많은 사용자의 대기시간이 줄어든다
    • 小? 사용자의 대기시간이 길어진다

HikariCP는 뭔데?

데이터베이스 커넥션 풀 프레임워크에는 대표적으로 Apache Commons DBCP, Tomcat DBCP, HikariCP, Oracle UCP 등이 있다.

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

스프링부트 서버를 처음 실행할 때 아래와 같은 로그를 볼 수 있다.

이는 서버의 실행과 동시에 HikariCP가 시작되고 있다는 의미이다.

  • HikariCP를 사용하는 이유는! 바로 벤치마크의 결과 가장 성능이 좋은 것으로 나타났기 때문!

    HikariCP는 바이트코드 수준까지 극단적으로 최적화되어 있다고 한다. 또한, Java의 컬렉션 프레임워크 사용에서 최적화가 잘 되어 있어 위와 같이 좋은 성능을 띄는 것으로 보인다.

  • HikariPool에 대한 로깅을 수행하려면?
    logging:
    	level:
    		com.zaxxer.hikari.pool.HikariPool: debug
  • 빌드 환경의 버전을 맞춰주어야 한다! Java Version에 호환되는 HikariCP가 각각 존재하는데, 자동으로 맞춰주지 않을 경우 또는 버전 호환성 문제로 에러가 발생한 경우 아래를 참고하여 설정해주자
    Artifacts
    Java 11+ maven artifact:
    
    <dependency>
       <groupId>com.zaxxer</groupId>
       <artifactId>HikariCP</artifactId>
       <version>5.0.0</version>
    </dependency>
    Java 8 maven artifact (maintenance mode):
    
    <dependency>
       <groupId>com.zaxxer</groupId>
       <artifactId>HikariCP</artifactId>
       <version>4.0.3</version>
    </dependency>
    Java 7 maven artifact (maintenance mode):
    
    <dependency>
       <groupId>com.zaxxer</groupId>
       <artifactId>HikariCP-java7</artifactId>
       <version>2.4.13</version>
    </dependency>
    Java 6 maven artifact (maintenance mode):
    
    <dependency>
       <groupId>com.zaxxer</groupId>
       <artifactId>HikariCP-java6</artifactId>
       <version>2.3.13</version>
    </dependency>

참고 자료

데이터베이스 커넥션 풀 (Connection Pool)과 HikariCP

[Java/Library] HikariCP 이해하고 적용하기 (with. MyBatis)

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글