Spring발행일 2024. 7. 9.원본 https://blog.naver.com/jword_/223505713353 ↗

[Java Spring] HikariCP 적용하기

[Java Spring] HikariCP 적용하기 — #HikariCP #커넥션풀 #개발자의도구들 🚨📝 📖 📒 AI스쿨 msa기반 java 백엔드 코스 중에 공...

#Spring#Naver Blog

#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

​

효율성에 대한 자료는 위 링크에서 확인 가능합니다.