토이프로젝트나 팀프로젝트 등을 Spring boot로 하였는데 한 번도 그 로그에 대해서 궁금해했던 적은 없는 것 같다.
그래서 이번에 로그에 대해서 분석을 해보니,
위와 같이 ~.HikariDataSource 에서 HikariPool 을 Starting 하는 부분이 보였다.
해당 스프링 프로젝트는 2.x 버전이고 2.x 버전에서 default JDBC Connection Pool이 HikariCP이다.
Connection 과 Connection Pool
Connection Pool 은 말 그대로 Connection 객체를 관리하는 공간으로,
WAS와 DB와의 통신을 위한 Connection 객체를 재사용할 수 있게 보관하는 곳이다. 쿼리를 보낼 때마다 Connection 을 계속 생성하게 되면 속도가 느려져 성능적으로 좋지 않기 때문에 DBCP를 활용하여, Connection 을 재사용하는 것이다.
그렇다면, Connection Pool 에 대한 설정이 중요한데 Hikari 를 기준으로 정리를 해보자.
현재 설정에 대해서는 .properties 혹은 .yml 에 설정을 추가해서 확인할 수 있다.
# application.yml 기준
logging:
level:
com.zaxxer.hikari: trace
위의 설정을 마치고 다시 애플리케이션을 실행하면 여러가지 설정에 대해 볼 수 있는데 내가 보고싶은 건 pool size 다.
위의 설정에 따르면, 동시에 많은 요청이 발생했을 때 10개에 대한 Connection 을 먼저 제공하고 나머지는 대기 상태로 순차적으로 처리된다. 이렇게 되면 Pool Size가 작기 때문에 상당히 느려지는데 그렇다고 Pool Size를 많이 잡아두면 그만큼 메모리를 많이 잡아먹게 된다. 그래서 적당한 Size를 설정할 수 있어야한다.
HikariCP Size 설정하기
HikariCP 공식문서에는 아래와 같이 나와있다.
Connection Pool Size = ((core_count * 2) + effective_spindle_count)
여기서 core_count 는 코어 수를 의미하고 effective_spindle_count 는 디스크 수를 의미한다.
( 이는 작업관리자 > 성능 탭에서 확인가능하다. )
그렇지만 이게 모든 경우의 수를 만족하는 것은 아니기 때문에 처음에만 위 설정에 따르고 그 이후에는 성능 테스트를 반복적으로 진행하며 최적의 세팅값을 찾아가는 게 중요하다.
이를 한 번 적용해보자.
내 노트북의 경우 위 공식문서에 따르면, 4*2 + 1 = 9 개가 된다.
spring:
datasource:
hikari:
# 사용하는 DBMS 종류에 맞게 driver-class-name,jdbc-url,username,password 설정 가능
maximum-pool-size: 9
사용하는 DBMS 종류는 모두 다를테니 해당 구간은 비워두고 maximum-pool-size 설정에 대한 코드만 남겼다.
이후 애플리케이션을 다시 실행해보면 아래와 같이 maximumPoolSize가 9로 변한 것을 알 수 있다.
참고
https://wearecommunity.io/communities/india-java-user-group/articles/2344
https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
'Web' 카테고리의 다른 글
[Spring] Exception Handling 에 대해서 (3) | 2023.07.03 |
---|---|
[Spring] @Builder 와 Builder 패턴 (0) | 2023.06.25 |
[Spring] @Email 과 이메일 정규식 표현 (0) | 2023.06.24 |
[Spring] Gradle 과 Maven 에 대해서 (0) | 2023.06.22 |
[Spring] Spring Security 로 CSRF 처리하기 (0) | 2023.06.15 |