0Pricing
Java Academy · 강의

HikariCP를 사용한 연결 풀링

연결을 효율적으로 재사용합니다

HikariCP를 사용한 연결 풀링은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

연결 풀을 사용하는 이유

데이터베이스 연결을 여는 작업은 비용이 큽니다. TCP 핸드셰이크, 인증, 세션 설정에 수십 밀리초가 걸릴 수 있습니다.

연결 풀은 여러 개의 열린 연결을 미리 준비해 둡니다. 코드는 연결 하나를 빌려 사용한 다음 반환하므로, 비용이 큰 연결 열기 작업을 저렴한 대여 작업으로 바꿀 수 있습니다.

HikariCP 소개

HikariCP는 Java의 사실상 표준 연결 풀입니다. 크기가 작고 빠르며 Spring Boot의 기본값입니다.

javax.sql.DataSource를 구현하므로 나머지 JDBC 코드는 그대로 유지됩니다. DriverManager 대신 풀에서 연결을 가져오기만 하면 됩니다.

연결 풀 구성하기

HikariConfig 객체를 사용해 HikariCP를 구성합니다. JDBC URL, 인증 정보, 풀 크기 등을 설정합니다.

그런 다음 이 객체로 HikariDataSource를 생성합니다. 일반적으로 애플리케이션 시작 시 한 번 수행하고 공유합니다.

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class Main {
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/shop");
        config.setUsername("app");
        config.setPassword("secret");
        config.setMaximumPoolSize(10);
        HikariDataSource ds = new HikariDataSource(config);
        System.out.println("Pool ready, max size " + config.getMaximumPoolSize());
        ds.close();
    }
}

연결 대여하기

ds.getConnection()을 호출해 연결을 빌리세요. 평소처럼 리소스 자동 관리 try 구문으로 감싸세요.

핵심은 다음과 같습니다. 풀링된 연결을 닫아도 물리적인 소켓은 닫히지 않습니다. 대신 연결이 재사용되도록 풀에 반환됩니다.

import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;

public class Main {
    public static void main(String[] args) {
        DataSource ds = new HikariDataSource();
        try (Connection conn = ds.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT count(*) FROM users");
             ResultSet rs = ps.executeQuery()) {
            if (rs.next()) System.out.println("Users: " + rs.getInt(1));
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

close()는 반납을 의미합니다

많은 개발자가 여기서 혼동합니다. 연결 풀을 사용하면 다음과 같습니다.

  • conn.close()는 연결을 풀에 반환합니다.
  • 풀은 다음에 빌릴 사용자를 위해 실제 소켓을 열린 상태로 유지합니다.

따라서 여전히 항상 close해야 합니다. 리소스 자동 관리 try 구문이 올바른 방법입니다. 연결을 폐기하는 것이 아니라 반납하는 것입니다.

풀 크기 설정

더 크다고 더 좋은 것은 아닙니다. 풀이 너무 크면 데이터베이스에 동시 작업이 과도하게 몰립니다.

HikariCP의 지침에 따르면 (core_count * 2) + effective_spindle_count 정도의 작은 풀이 대규모 풀보다 대개 더 좋은 성능을 냅니다. maximumPoolSize는 상한이며, minimumIdle은 몇 개의 연결을 미리 준비해 둡니다.

public class Main {
    public static void main(String[] args) {
        int cores = 4;
        int spindles = 1; // SSD-ish
        int recommended = (cores * 2) + spindles;
        System.out.println("Suggested max pool size: " + recommended);
    }
}

주요 시간 제한

HikariCP는 데이터베이스가 멈췄을 때 애플리케이션을 보호하는 시간 제한을 제공합니다.

  • connectionTimeout — 연결 대여가 실패하기 전에 기다리는 시간입니다(기본값 30초).
  • idleTimeout — 유휴 연결이 유지되는 시간입니다.
  • maxLifetime — 이 수명이 지나면 연결을 폐기합니다(데이터베이스 자체의 시간 제한보다 짧게 설정하세요).

연결 검증

네트워크는 연결을 조용히 끊을 수 있습니다. HikariCP는 연결을 전달하기 전에 연결이 유효한지 확인할 수 있습니다.

최신 JDBC 드라이버는 Connection.isValid(timeout)을 사용하며, HikariCP가 이를 자동으로 호출합니다. isValid가 없는 오래된 드라이버에는 connectionTestQuery를 설정할 수도 있습니다.

누수 감지

연결 누수는 코드가 연결을 빌린 후 닫지 않을 때 발생합니다. 결국 풀이 고갈되어 모든 대여 작업이 시간 초과됩니다.

leakDetectionThreshold를 설정하세요(예: 20000밀리초). 그러면 HikariCP가 이 시간보다 오래 점유된 연결에 대해 호출 스택을 기록하여 문제를 일으킨 코드를 바로 찾을 수 있게 합니다.

애플리케이션마다 풀 하나

HikariDataSource를 한 번 생성한 후 애플리케이션의 전체 수명 동안 재사용하세요.

요청마다 새 풀을 만들면 연결 풀의 목적이 사라집니다. 매번 시작 비용을 지불해야 하기 때문입니다. 풀은 종료할 때만 ds.close()로 닫으세요.

풀 모니터링

HikariCP는 실행 중인 지표를 제공하므로 풀의 상태를 확인할 수 있습니다.

  • 활성 연결, 유휴 연결, 전체 연결
  • 현재 연결을 기다리는 스레드

Micrometer, Dropwizard Metrics, JMX와 연동됩니다. '대기 중'인 수가 계속 높다면 풀이 너무 작거나 연결이 지나치게 오래 점유되고 있다는 뜻입니다.

빠른 확인

HikariCP를 사용할 때 빌린 연결에서 close()를 호출하면 어떻게 되나요?

복습

HikariCP를 사용하면 연결을 효율적으로 재사용할 수 있습니다.

  • 시작 시 HikariDataSource를 한 번 구성합니다.
  • 리소스 자동 관리 try 구문에서 getConnection()으로 연결을 빌리고, close()로 풀에 반환합니다.
  • maximumPoolSize를 적절히 작게 유지합니다.
  • connectionTimeout, maxLifetime, 연결 검증을 조정합니다.
  • leakDetectionThreshold를 사용해 반환되지 않은 연결을 찾습니다.

자주 묻는 질문

“HikariCP를 사용한 연결 풀링” 강의는 무료인가요?

네 — “HikariCP를 사용한 연결 풀링” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“HikariCP를 사용한 연결 풀링”에서 뭘 배우나요?

연결을 효율적으로 재사용합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“HikariCP를 사용한 연결 풀링” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JDBC 기초
  2. PreparedStatement
  3. 트랜잭션
  4. HikariCP를 사용한 연결 풀링
← Java Academy(으)로 돌아가기