connection pool이란
DB Connection Pool을 잘 이해하기 위해, 복잡한 DB connection 획득에 대해서 먼저 알아보자.
어플리케이션은 DB 관련 로직을 수행할 때, DB Connection을 획득해야 한다. 예를 들어, 회원 가입 로직을 실행 할 때, 회원 가입자 목록 DB Table에 접근할 Connection이 필요한 것이다. DB Connection을 획득하기 위해서는 먼저,
어플리케이션은 DB드라이버를 통해 DB와 TCP/IP 커넥션 연결을 한다.
그리고 DB 드라이버를 통해 id, password 인증 정보를 보낸다.
DB는 인증 정보를 확인해서 DB 연결이 완료 되었다는 응답을 보낸다.
마지막으로 응답을 받은 DB 드라이버에서 커넥션 객체를 생성한다.
위와 같은 복잡한 절차로 Connection을 획득은 많은 자원과 시간이 든다. 그래서 매 쿼리마다 커넥션을 새로운 커넥션을 획득 한다면, 서비스 속도가 느려질 것이다. 그래서 해결 방법으로 DB Connection Pool을 이용한다.
그래서, DB Connection Pool이란
어플리케이션 로직이 실행 할 때마다, 커넥션을 획득하는 것이 아니라, DB 드라이버가 미리 만들어 놓은 커넥션 Pool에 있는 커넥션을 필요할 때마다 쓰고, 반환하는 것이다. 그래서 자원 소모가 많은 커넥션 생성 과정을 생략할 수 있어서, DB와 관련된 어플리케이션 로직을 빠르게 실행 할 수 있다.
CP종류와 HikariCP 알아보기
커넥션 풀 종류로는 아파치에서 제공하는 commons-dbcp2 , 톰캣에 내장되어 사용하는tomcat-jdbc pool , HikariCP 등이 있다.
그 중에서 HikariCP는 성능성과 편리함이 높아 많이 사용된다. 스프링 부트 2.0부터는 기본 커넥션 풀로 HikariCP를 사용한다.
HikariCP 설정 요소 알아보기
필수
🔤dataSourceClassName
DataSourceJDBC 드라이버에서 제공 하는 클래스 이름.
ex)spirng.datasource.driver-class-name: org.h2.Driver
🔤jdbcUrl
🔤username
🔤password
자주 사용되는 설정
✅autoCommit(default:true)
connection이 종료나 pool에 반환할 때, connection에 속해있는 transaction을 commit 할지를 결정한다.
⏳connectionTimeout(default:30000)
풀에서 커넥션 연결을 기다리는 최대 시간을 제어한다.
이 시간을 초과하면 SQLException이 발생한다. 허용 가능한 최저 연결 제한 시간은 250m이다.
⏳idleTimeout
커넥션 풀에서 아직 연결되지 않고 유휴 상태로 있는 커넥션의 유지시간을 설정한다.
idleTimeout시간이 초과된 커넥션은 연결 해제된다.
⏳keepaliveTime
keepaliveTime에 도달하면 주기적으로 커넥션의 유효성을 검증한다.
커녁션이 잘 살아 있는지 확인한다.
⏳maxLifetime(default: 1800000(30분))
이 속성은 풀에서 커넥션의 최대 수명을 제어한다.
🔢minimumIdle(defualt: maximumPoolSize와 동일)
이 속성은 풀에서 유지하려는 최소 유휴 연결 수를 제어한다.
🔢maximumPoolSize(defaullt: 10)
이 속성은 유휴 및 사용 중인 연결을 모두 포함하여 풀이 도달할 수 있는 커넨션 최대 크기를 제어한다.
🔤poolName
이 등록 정보는 연결 풀에 대한 사용자 정의 이름을 나타낸다.
DB가 아닌 CP가 쓰이는 곳
https://coding-business.tistory.com/44
Reference
김영한 DB1-커넥션풀과 데이터 소스
https://code-lab1.tistory.com/209
https://github.com/brettwooldridge/HikariCP
https://escapefromcoding.tistory.com/712
https://yjh5369.tistory.com/entry/HikariCP-%EC%86%8C%EA%B0%9C
'Web Sever 개발과 CS 기초 > 스프링' 카테고리의 다른 글
CORS 이해와 동작 원리 파악 (0) | 2022.12.25 |
---|---|
ORM과 JPA, 영속성 쉽게 이해하기 (0) | 2022.12.11 |
SpringBoot 설정 파일 기능 활용하기(Profile나누기, 환경 변수 설정, 설정 파일 분리, group하기) (0) | 2022.11.13 |
@ExceptionHandler, @ControllerAdvice를 사용한 예외를 원하는 Response 처리 (0) | 2022.11.12 |
RFC7807가 제시한 오류 메시지 생성하기 (0) | 2022.11.07 |