Java/Spring

[DB] Spring boot 2.x에서 기본으로 지원하는 HikariCP에 대해 알아보자

SeungbeomKim 2025. 5. 15. 21:56

Spring boot 2.x 버전에서는 DB Connection Pool로 HikariCP를 지원합니다. 이를 통해 매번 Connection을 생성하지 않아도 되며, Connection Pool에서 Connection을 가져와 DB 연결 및 해제를 효율적으로 할 수 있게 됩니다.

 

우선 HikariCP가 무엇인지 설명드리고, 연관된 개념과 Connection Pool의 동작 과정에 대해 알아보겠습니다.

 

HikariCP (HikariCP Connection Pool)

  • DB Connection을 관리해 주는 도구
  • Connection Pool이 설정된 connection의 사이즈만큼 연결을 허용하여 http 요청에 대해 순차적으로 db 커넥션을 처리해 주는 기능입니다.
  • DB Connection Pool이며, Common CP 등 다양한 라이브러리들 중 가볍고 빠르게 처리가 가능합니다.
    • overhead가 없으며, 약 130KB의 경량화된 라이브러리 입니다.

 

HikariCP는 DB의 커넥션 정보를 효율적으로 관리해 주는 커넥션 풀 도구입니다. 이제 실제로 데이터베이스와 커넥션을 맺는 과정이 어떻게 이루어지는지 설명드리겠습니다.


이 과정에는 JDBC(Java Database Connectivity)라는 개념이 포함되어 있으며, 먼저 JDBC가 무엇인지 간단히 살펴본 후, 커넥션이 맺어지는 과정을 단계적으로 알아보겠습니다.

 

JDBC(Java Database Connectivity)

  • Java에서 데이터베이스에 접속할 수 있도록 하는 자바 API
  • JDBC는 데이터베이스에서 자료를 쿼리 하거나 업데이트하는 방법을 제공합니다.
  • DB 드라이버를 로드하고, 연결을 통해 커넥션 객체를 얻는 과정이 포함됩니다.
  • 이후, 커넥션 객체를 통해 DB에 연결하고, 작업 후 연결을 닫는 과정이 필요합니다.
  • 이러한 반복적인 커넥션 생성 비용을 줄이기 위해, HikariCP와 같은 DB 커넥션 풀 라이브러리를 사용합니다.

 

JDBC 표준 인터페이스

  • java.sql.Connection - 연결
  • java.sql.Statement - SQL을 담은 내용
  • java.sql.ResultSet - SQL 요청 응답

 

Spring Data JDBC, JPA 등과 같은 기술이 등장하면서 JDBC API를 직접적으로 사용할 일은 줄어들었습니다. 하지만, JDBC API를 사용하기 위해서는 JDBC 드라이버(DB와 통신을 담당하는 인터페이스)를 로딩한 후 DB와 Connection을 맺게 됩니다. 위 사진을 보면, JDBC 표준 인터페이스를 통해 MySQL, Oracle 등 여러 DBMS의 드라이버와 독립적으로 애플리케이션을 개발할 수 있도록 추상화를 지원합니다.

 

자바 소스코드로 DB Connection을 맺는 경우를 간단하게 보여드리겠습니다. (예시: MySQL Driver)

public class JdbcExample {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String username = "root";
        String password = "password";

        Connection conn = DriverManager.getConnection(url, username, password);
        PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
        stmt.setInt(1, 1);

        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString("name"));
        }

        rs.close();
        stmt.close();
        conn.close();
    }
}
  1. DriverManager를 통해 드라이버를 가져온 후, Connection 객체 생성
  2. Statement 객체 생성 (쿼리 실행을 위한 SQL문)
  3. Query 실행 후 ResultSet 객체 반환
  4. ResultSet 객체 Close
  5. Statement 객체 Close
  6. Connection 객체 Close

 

Connection 객체 생성 과정

 

  • 애플리케이션에서 DriverManager.getConnection(url, username, password)를 호출하여 커넥션 생성을 요청합니다.
  • DB 드라이버는 데이터베이스와 TCP/IP 소켓 연결을 생성합니다.
  • TCP/IP 연결이 성공하면, 사용자 이름(username), 비밀번호(password), DB URL 등의 인증 정보가 데이터베이스로 전달됩니다.
  • 데이터베이스는 전달받은 정보를 기반으로 인증을 수행합니다.
  • 인증에 성공하면, DB 드라이버는 Connection 객체를 생성하여 애플리케이션에 반환합니다.

 

이러한 Connection 객체를 매번 생성해 주면, 매우 비효율적이므로 이를 보완하기 위해 도입된 개념이 Connection Pool입니다. Connection Pool을 통해 위 Connection 객체를 생성하는 과정을 최소화하고 자원을 효율적으로 관리하기에 성능이 향상될 수 있습니다. Connection Pool의 동작 과정에 대해서 설명드리겠습니다. 

 

Connection Pool Flow

 

 

  1. Application 실행 시점에 Connection Pool에 Connection을 생성합니다.
  2. http 요청 시, Connection Pool 내에서 Connection 객체를 사용합니다.
  3. 사용이 완료된 Connection 객체는 Connection Pool에 반환합니다. (실제 닫는 것 X)

 

Connection Pool 만으로도 많은 장점을 누릴 수 있지만, 실제 HiKariCP는 다른 해당 Bench Mark를 통해 다른 Connection Pool Library보다 월등히 뛰어나다는 사실을 확인할 수 있습니다.

Connection Cycle ops/ms: DataSource.getConnection()/Connection.close()의 사이클 Statement Cycle ops/ms: Connection.prepareStatement(), Statement.execute(), Statement.close()의 사이클

 

HikariCP Option

spring: 
    datasource: 
        hikari: 
            driver-class-name: com.mysql.cj.jdbc.Driver 
            jdbc-url: jdbc:mysql://{url}:{port}/{schema} 
            maximum-pool-size: 10 (default)
            minimum-idle: 10 (default)
            max-lifetime: 1800000 (default)
            idle-timeout: 300000 (default)
            connection-timeout: 30000 (default)
  • maximum-pool-size
    • 커넥션 풀의 최대 크기 (default: 10)
  • minimum-idle
    • 커넥션 풀에서 유지할 idle connection 수 (default: 10)
  • max-lifetime
    • connection pool에서 살아있을 수 있는 최대 시간 (default: 30m)
  • idle-timeout
    • idle connection이 connection pool에서 제거되기 전까지 대기하는 시간입니다.
    • minimum-idle을 초과한 커넥션에 대해서만 제거됩니다.
    • max-lifetime > idle-timeout 으로 설정합니다.
  • connection-timeout (default: 30s)
    • connection pool에서 connection을 획득하기 위해 기다리는 시간 (default:30s)

 

 

 

<참고 자료>

https://ittrue.tistory.com/250

 

[Java] JDBC란 무엇인가? - Java Database Connectivity

JDBC란? JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API이다. JDB

ittrue.tistory.com

https://adjh54.tistory.com/73

 

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

해당 글에서는 HikariCP에 대해 이해하고 영속성 프레임워크(Persistence Framework)인 MyBatis와 연동을 하는 적용 방법에 대해서 공유 목적으로 작성한 글입니다.      💡 [참고] 이전에 구성하였던

adjh54.tistory.com

https://devoong2.tistory.com/entry/Spring-Boot-Hikari-CP-%EC%9D%98-%EC%98%B5%EC%85%98%EA%B3%BC-%EC%84%A4%EC%A0%95%EB%B0%A9%EB%B2%95

 

[Spring Boot] Hikari CP 의 옵션과 설정방법

Hikari CP 옵션과 설정 방법Hikari CP 는 SpringBoot 2.0.0 버전 이상부터 디폴트로 설정된 Connection Pool 입니다.이번엔 Hikari CP 의 설정 옵션들은 어떤것들이 있는지, 설정시 고민해야할 부분은 어떤것들이

devoong2.tistory.com