Spring Boot 에서 데이터베이스 관련 설정 값을 지정할 때 (ex. spring.datasource.hikari.jdbc-url) 사용하게 되는 hikari 에 대해 정리하고 싶었다.
Spring Boot 의 기본 커넥션 풀
Sprint Boot 2.0 부터 기본 커넥션 풀이 Tomcat 에서 HikariCP 로 변경되었다.
커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어서 Pool 에 담아뒀다가 요청이 들어오면 Pool 에 있는 커넥션을 연결해서 사용하고 다시 Pool에 반환하는 방식을 말한다.
어떤 부분이 좋아져서 기본 커넥션 풀이 변경된 것일까?
기존 커넥션 풀 보다 좋아진 점
위의 표는 JMH 벤치마크 결과이다.
JMH는 JVM을 대상으로 하는 Java와 다른 언어로 작성된 벤치마크를 빌드, 실행, 분석할 수 있다.
Connection Cycle 은 DataSource.getConnection() / Connection.Close() 의 주기를 측정했다.
커넥션 풀에서 커넥션을 가져오고 다시 반납하는 주기를 측정한 벤치마크이다.
Statement Cycle 은 Connection.prepareStatement(), Statement.execute(), Statement.Close() 주기를 측정했다.
쿼리를 수행할 수 있는 객체를 만들고 쿼리를 실행하고 객체를 닫는(메모리의 연결을 해제하는) 주기를 측정한 벤치마크이다.
두 벤치마크 모두 HikariCP 가 압도적으로 높은 수치를 나타낸다. 즉, 커넥션 풀을 주고받는 시간도 짧아졌으며 쿼리를 실행할 수 있는 객체를 생성하고 쿼리를 수행하는 속도도 빨라졌다는 것이다.
Spring Boot 에서 설정하는 방법
pom.xml 에 의존성 정보를 추가한다.
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
application.properties 파일에 연결하는 데이터베이스의 설정 정보를 추가한다.
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/echos_db?serverTimezone=UTC
spring.datasource.hikari.username=root
spring.datasource.hikari.password=1234
HikariDataSource Bean 을 생성한다. 나는 별도의 configuration class 에 추가했다.
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;
@Configuration
@PropertySource("classpath:/application.properties")
public class DatabaseConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public DataSource dataSource() {
DataSource dataSource = new HikariDataSource(hikariConfig());
return dataSource;
}
}
정상적으로 연결되면 아래와 같은 로그를 확인할 수 있다.
오랫동안 사용해보면서 생긴 문제/해결방안, 단점에 대해서도 다뤄야겠다.
참고자료
github.com/brettwooldridge/HikariCP
'IT' 카테고리의 다른 글
[정보보안] CVE (Common Vulnerabilities & Exposures) (0) | 2020.10.13 |
---|---|
[정보보안] Windows Server OS 사용자 계정관리 (0) | 2020.10.03 |
[Spring Boot] Maven 과 Gradle (0) | 2020.09.13 |
[Tomcat] Tomcat 의 3대 구성요소 (0) | 2020.08.24 |
[설계] 실무에서 데이터 크롤링(Data Crawling) 프로그램 구조 및 설계 (0) | 2020.04.11 |