[Java Spring] HikariCP 적용하기
[Java Spring] HikariCP 적용하기 — #HikariCP #커넥션풀 #개발자의도구들 🚨📝 📖 📒 AI스쿨 msa기반 java 백엔드 코스 중에 공...
#HikariCP #커넥션풀 #개발자의도구들
🚨📝 📖 📒
AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다
\* 현재 Spring 프로젝트를 진행 중입니다. 전체적인 목차를 보시려면 여기를 눌러주세요.
HikariCP
이전글을 통해 connection pool의 필요성에 대해 다뤄보며, 어떤 개념인지 학습하였습니다. 이번에는 해당이론을 구현해볼 차례입니다.
package com.example.webserver;import jakarta.annotation.PostConstruct;import lombok.Getter;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Repository;import java.sql.\*;import java.util.HashMap;@Getter@Repository@Slf4jpublic class DataBaseModel { private Connection connection; private final Object dataBaseLock = new Object(); private final String url = "jdbc:mariadb://localhost:3306/http"; private final String user = "root"; private final String password = "3353"; @PostConstruct public void startConnection() { log.info("start connection!!"); try { this.connection = DriverManager.getConnection(url, user, password); log.info("connecting success"); } catch (SQLException e) { log.error("<<DataBaseManger>>\n - sql err: " + e.getMessage() + "\n"); } } public boolean putText(String key, String value) { String sql = "INSERT INTO texts (text\_id, text\_value) VALUES (?, ?)"; try { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, key); preparedStatement.setString(2, value); int effectedRows = preparedStatement.executeUpdate(); preparedStatement.close(); if (effectedRows > 0) { log.info("A new row has been inserted successfully."); return true; } else { log.error("A new row insertion failed"); return false; } } catch (SQLException e) { log.error("DataBase Manger: putText err: " + e.getMessage()); return false; } } --- 생략 ---} |
|---|
현재 JDBC에서 사용가능한 connection pool 라이브러리입니다. 간단한 사용법을 알아보며 기존 코드를 수정하는 방향으로 글을 작성해 보겠습니다.
build.gradle
우선 필요한 의존성들을 모두 추가해줍시다.
| implementation 'com.zaxxer:HikariCP:5.0.1'implementation 'org.mariadb.jdbc:mariadb-java-client:2.7.3' |
|---|
connection setting
| package com.example.webserver;import jakarta.annotation.PostConstruct;import lombok.Getter;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Repository;import java.sql.\;import java.util.HashMap;@Getter@Repository@Slf4jpublic class DataBaseModel { private HikariDataSource dataSource; @PostConstruct public void startConnection() { log.info("Starting database connection with HikariCP"); HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl("jdbc:mariadb://localhost:3306/db"); hikariConfig.setUsername("userID"); hikariConfig.setPassword("pw"); hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver"); hikariConfig.setMaximumPoolSize(10); hikariConfig.setMinimumIdle(10); hikariConfig.setConnectionTimeout(20000); hikariConfig.setIdleTimeout(300000); hikariConfig.setMaxLifetime(600000); this.dataSource = new HikariDataSource(hikariConfig); try (Connection connection = dataSource.getConnection()) { log.info("Database connection established successfully"); } catch (SQLException e) { log*.error("Failed to establish database connection: " + e.getMessage()); } } --- 생략 ---} |
|---|
우선 기존에 사용하던 startConnection() 메서드(Spring에 의해 제일 처음으로 실행되는 메서드)를 수정해보았습니다.
새로운 connection을 등록하기 위해 연결정보를 HikariConfig에 등록합니다.PoolSize나 time out등 세부적인 연결 설정 역시 등록이 가능합니다.
method logic 수정
맨 위의 코드를 보시면 아시겠지만, 저는 데이터베이스에 로직을 수행할 때마다 매번 connection을 연결하였습니다. 하지만 이제 HikariCP pool에서 로직을 받아서 끌어 쓰면 됩니다.
public Optional<String> putText(String key, String value) { String sql = "INSERT INTO texts (text\_id, text\_value) VALUES ?, ?"; try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(sql)) { preparedStatement.setString(1, key); preparedStatement.setString(2, value); int affectedRows = preparedStatement.executeUpdate(); // Check if any rows were affected. if (affectedRows > 0) { log.info("A new row has been inserted successfully."); return Optional.of("insertion successful"); // Return true if the insertion was successful. } else { log.error("A new row insertion failed"); return Optional.empty(); // Return false if the insertion failed. } } catch (SQLException e) { log.error("DataBase Manger: putText err: " + e.getMessage()); Optional.empty(); }} |
|---|
로직이 크게 바뀐건 없으나, connection 연결 설정 부분에서 dataSource를 불러서 연결하는 것을 집중적으로 확인하시면 될 것 같습니다.
효율성 그래프
https://github.com/brettwooldridge/HikariCP
효율성에 대한 자료는 위 링크에서 확인 가능합니다.