반응형
반응형
해당 글에서는 HikariCP에 대해 이해하고 영속성 프레임워크(Persistence Framework)인 MyBatis와 연동을 하는 적용 방법에 대해서 공유 목적으로 작성한 글입니다.
💡 [참고] 이전에 구성하였던 환경에 'HikariCP'를 적용하였습니다
1) 개발 환경
💡 해당 글은 Spring Boot 내에 HikariCP를 사용하기 위한 개발 환경입니다.
개발환경 | 버전 |
java | 1.8 |
Spring Boot | 2.7.4 |
빌드관리도구 | Gradle 7.5 |
개발 툴 | IntelliJ IDEA 2022.3 |
spring-boot-starter-data-jdbc | 2.7.4 |
mybatis-spring-boot-starter | 2.2.2 |
2) HikariCP, DBCP(DataBase Connection Pool)
1. HikariCP
💡 HiKari
- Hi·ka·ri [hi·ka·'lē] ( 원산지: 일본어 ): 빛;이라는 의미입니다.
💡 HiKariCP(Hikari Connection Pool)
- Fast, simple, reliable. HikariCP is a "zero-overhead" production ready JDBC connection pool. At roughly 130Kb, the library is very light.
- 빠르고, 간단하고 믿을 수 있는 HikariCP는 "오버헤드 제로"의 프로덕션 지원 JDBC 연결 풀입니다. 대략 130KB이며 이 라이브러리는 매우 가볍습니다.
[출처] https://github.com/brettwooldridge/HikariCP#-hikaricpits-fasterhikari-hikal
💡 HiKariCP는 데이터베이스 연결(Connection)을 관리해 주는 도구(라이브러리)입니다.
💡 HiKariCP에서 커넥션 풀(Connection Pool)이 설정된 커넥션의 사이즈만큼의 연결을 허용하며 HTTP 요청에 대해 순차적으로 DB 커넥션을 처리해 주는 기능을 수행합니다.
💡 HiKariCP는 DBCP(Database Connection Pool)이며 HikariCP, Common DBCP 등 라이브러리가 존재하는데 가볍고 빠르게 처리할 수 있다는 장점이 있는 HikariCP를 사용합니다.
[ 더 알아보기 ]
💡 오버헤드(overhead)란?
- 오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 의미합니다.
💡[참고] DBCP에 상세히 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
2. 데이터베이스 커넥션 풀 (DBCP: Database Connection Pool)
2.1. JDBC(Java DataBase Connetion) 과정
💡 JDBC 연결은 드라이버를 로드하고 연결하여 객체를 받아와야 하는 과정을 가지고 있습니다.
이 과정은 매번 사용자가 요청할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하는 과정이 불편하고 속도와 자원 소모에 대한 단점이 있었습니다.
- 그래서 이 단점을 보완하기 위해 ‘데이터 베이스 커넥션 풀(DBCP)’을 사용합니다
2.2. DBCP(Database Connection Pool) 이해 및 과정
💡 데이터베이스 커넥션 풀 (DBCP: Database Connection Pool)
- 데이터베이스 커넥션 풀은 최초 Pool 내에서 연결(Connection)들을 하여 HTTP 요청에 따라 응답을 제공하고 반환받아서 이를 재 사용하는 것을 의미합니다.
💡 DBCP(Database Connection Pool) 과정
💡 데이터베이스 커넥션 풀 (DBCP: Database Connection Pool)의 과정
1. 애플리케이션이 실행되면서 Pool 내에 Connection들을 생성해 둡니다.
2. HTTP의 요청이 올 때 Pool 내에서 Connection 객체를 가져다가 사용합니다.
3. 사용이 완료된 Connection 객체는 Pool 내에 반환합니다.
💡 DBCP의 장점
1. 애플리케이션과 데이터 베이스와의 연결(Connection)을 줄여서 비용을 줄입니다.
2. 'Pool'내에 미리 연결(Connection)되어 있기에 매번 생성하는 비용을 줄일 수 있습니다
3. 연결(Connection)에 대해서 조정을 할 수 있습니다. (단, 인프라의 DB Connection 수와 맞추어야 합니다.)
- Connection Pool을 크게 설정하면 메모리 소모가 큰 대신 많은 사람의 대기시간이 줄어듭니다.
- Coonection Pool을 적게 설정하면 사용자의 대기시간이 길어집니다.
2.3. HikariCP Benchmark
💡 해당 사진은 JDBC와 HikariCP 간에 벤츠마크를 수행한 결과입니다.
💡 Connection Cycle ops/ms는 DataSource.getConnection(), Connection.close()에 대한 DB 연결과 연결해제를 비교 측정한 내용입니다.
💡 Statement Cycle ops/ms는 Connection.prepareStatement(), Statement.execute(), Statement.close() 데이터 베이스의 상태로 준비 > 수행 > 종료 단계를 비교 측정한 내용입니다
[출처] 공식사이트 - JMH Benchmarks
[ 더 알아보기 ]
💡 벤치마크(benchmark)
- 컴퓨팅에서 특정 오브젝트(하드웨어 또는 소프트웨어 등)에 대해 일반적으로 수많은 표준 테스트와 시도를 수행함으로써 오브젝트의 상대적인 성능 측정을 목적으로 컴퓨터 프로그램을 실행하는 행위이다.
[출처] https://ko.wikipedia.org/wiki/벤치마크_(컴퓨팅)
3) 환경 설정하기
💡 기존의 JDBC로 연결된 PostgreSQL를 DBCP의 HikariCP로 변경합니다.
1. 빌드 관리 도구에 라이브러리 추가
💡 기존 라이브러리 spring-boot-data-jdbc 내에 해당 HikariCP가 포함이 되어 있습니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
}
2. application.properties 파일 수정
💡 기존에는 ‘datasource’ 내에 바로 연결을 하였으나 ‘hikari’를 중간에 거쳐서 환경설정을 하였습니다.
spring:
datasource:
hikari:
driver-class-name: org.postgresql.Driver
jdbc-url: jdbc:postgresql://localhost:8000/test_db
username: test
password: xxxxx
pool-name: Hikari Connection Pool # Pool Name Alias
maximum-pool-size: 20
3. DBConfig 파일 생성
💡 해당 파일에서는 서버가 로드되는 시점에 @Configuration Hikari에 환경설정을 해주는 과정입니다.
💡 HikariCP 설정과 최초 데이터베이스 Connection을 수행합니다.
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@PropertySource("classpath:/application.properties")
public class DBConfig {
final
ApplicationContext applicationContext;
public DBConfig(ApplicationContext ac) {
this.applicationContext = ac;
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public DataSource dataSource() {
return new HikariDataSource(hikariConfig());
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean session = new SqlSessionFactoryBean();
session.setDataSource(dataSource);
session.setMapperLocations(applicationContext.getResources("classpath:mapper/*.xml"));
session.setTypeAliasesPackage("com.test.testApi.model");
session.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis/mybatis-config.xml"));
return session.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4) 수행 결과
1. 서버 기동 시 HikariCP 수행 결과
💡 서버가 동작하는 동시에 HikariCP가 시작되는 것을 확인할 수 있습니다.
2. Logging을 HikariCP에 지정하여 서버 기동 시 로그 확인 수행 결과
💡 임의로 지정한 'Connection'이 20개 초기 수행이 됨을 확인하였습니다.
spring:
# PostgreSQL DB & Hikari DBCP 설정
datasource:
hikari:
driver-class-name: org.postgresql.Driver
jdbc-url: jdbc:postgresql://192.168.88.247:5432/test_db
username: test
password: xxxxx
pool-name: Hikari Connection Pool # Alias
maximum-pool-size: 20
# HikariPool에 대한 로깅을 수행함
logging:
level:
com.zaxxer.hikari.pool.HikariPool: debug
3. 참고 수행 사항
💡 DB 내에서 활성화된 Pool의 정보를 확인하는 방법
SELECT *
FROM pg_stat_activity
WHERE datname = 'DB Name';
💡 DB내에서 실제 Connection 수를 확인하는 방법
SELECT count(*)
FROM pg_stat_activity
WHERE application_name like '%JDBC%';
5) 참고사항
💡 HikariCP를 Connection pool로 20을 지정하여 개발을 하고 있었는데 각각의 개발자가 API 서버를 켜서 수행을 하는 경우 인당 Connection pool이 20개씩 잡혀있어서 Transaction 에러가 발생하거나 느려지는 문제가 발생하였습니다.
(PostgreSQL 기준 Default Connection pool은 100입니다)
💡 이에 따라 개발 단계에서는 적정한 Connection Pool을 지정하여서 사용하여야 할 것 같습니다
💡 PostgreSQL의 경우 환경 파일은 아래의 경로를 통해서 최대 Connection Pool을 확인할 수 있습니다.
# 루트 경로 접근
$ cd ..
# 루트 경로 접근
$ cd ..
# postgreSQL 로컬 폴더 접근
$ cd /usr/local/var/postgres/
# postgreSQL 환경 파일 확인
$ vi postgresql.conf
💡 [참고] Connection Pool의 최대 사이즈를 산정하는 방법
오늘도 감사합니다😀
반응형
'Java > Spring Boot' 카테고리의 다른 글
[Java/Library] Thymeleaf, Thymeleaf Layout 적용하기 (4) | 2022.10.30 |
---|---|
[Java/Library] Slf4j - Log4j2 이해하고 설정하기 (2) | 2022.10.21 |
[Java/Library] Spring Boot 2.x 환경에서 Swagger 이해하고 적용하기 : SpringDoc openAPI UI (2) | 2022.10.18 |
[Java/Library] Lombok 이해하고 적용하기 -1 : 설정 및 기초 (0) | 2022.10.18 |
[JAVA] Spring Boot내에서 MyBatis & PostgreSQL 연동하기 (0) | 2022.10.04 |