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();
}
}
- DriverManager를 통해 드라이버를 가져온 후, Connection 객체 생성
- Statement 객체 생성 (쿼리 실행을 위한 SQL문)
- Query 실행 후 ResultSet 객체 반환
- ResultSet 객체 Close
- Statement 객체 Close
- 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
- Application 실행 시점에 Connection Pool에 Connection을 생성합니다.
- http 요청 시, Connection Pool 내에서 Connection 객체를 사용합니다.
- 사용이 완료된 Connection 객체는 Connection Pool에 반환합니다. (실제 닫는 것 X)
Connection Pool 만으로도 많은 장점을 누릴 수 있지만, 실제 HiKariCP는 다른 해당 Bench Mark를 통해 다른 Connection Pool Library보다 월등히 뛰어나다는 사실을 확인할 수 있습니다.
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
[Java] HikariCP 이해하고 적용하기 (with. MyBatis)
해당 글에서는 HikariCP에 대해 이해하고 영속성 프레임워크(Persistence Framework)인 MyBatis와 연동을 하는 적용 방법에 대해서 공유 목적으로 작성한 글입니다. 💡 [참고] 이전에 구성하였던
adjh54.tistory.com
[Spring Boot] Hikari CP 의 옵션과 설정방법
Hikari CP 옵션과 설정 방법Hikari CP 는 SpringBoot 2.0.0 버전 이상부터 디폴트로 설정된 Connection Pool 입니다.이번엔 Hikari CP 의 설정 옵션들은 어떤것들이 있는지, 설정시 고민해야할 부분은 어떤것들이
devoong2.tistory.com
'Java > Spring' 카테고리의 다른 글
[Spring] csv 파일의 데이터 파싱 및 저장 성능 개선기 (JPA save() vs JdbcTemplate batchUpdate() vs MariaDB LOAD DATA INFILE) (2) | 2025.05.22 |
---|---|
[JMeter] Apache JMeter를 활용한 성능 테스트 (4) | 2025.04.18 |
[Spring] java 메모리에 존재하는 list 데이터 페이징 처리 (2) | 2025.02.12 |
[Spring] @Formula annotation을 활용하여 count 조회 성능 개선 (1) | 2025.02.10 |
[Spring] Json 직렬화, 역직렬화 (0) | 2024.12.24 |