[spring] 라이브러리 _HikariCP 알기

youuu·2023년 3월 22일
0

SPRING

목록 보기
31/33

이전에 라이브러리는 제대로 안봤었다.
콘솔이나 오류메세지로 많이 봤던 HikariCP 커넥션 풀, hibernate 이 정확히 뭔지 알아봐야겠다.

목표!
HikariCP 커넥션 풀, hibernate 동작 이해하기


스프링 부트 라이브러리 >>

  • spring-boot-starter-web
    • spring-boot-starter-tomcat: 톰캣 * (웹서버)
    • spring-webmvc: 스프링 웹 MVC
  • spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
  • spring-boot-starter-data-jpa
    • spring-boot-starter-aop
    • spring-boot-starter-jdbc
      • HikariCP 커넥션 풀 (부트 2.0 기본)
    • hibernate + JPA: 하이버네이트 + JPA
    • spring-data-jpa: 스프링 데이터 JPA
  • spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
    • spring-boot
      • spring-core
    • spring-boot-starter-logging
      • logback, slf4j

🍋 HikariCP 커넥션 풀

1. 커넥션 풀이란?

서버가 DB에 연결하기 위한 Connecting 비용이 가장 큰 비율을 차지한다. 이를 보완할 수 있는 방법이 바로 Connection Pool이다

커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것으로 필요할 때마다 커넥션 풀의 커넥션을 이용하고 반환하는 기법이다.

  • 미리 만들어 놓은 커넥션을 이용하면 Connection에 필요한 비용을 줄일 수 있다. 따라서 DB에 빠르게 접속할 수 있다.
  • 커넥션 풀을 사용하면 커넥션 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈을 방지할 수 있으며, DB 접속 모듈을 공통화해 DB 서버의 환경이 바뀔 경우 유지보수를 쉽게 할 수 있다.

2. HikariCP란?

HikariCP는 가벼운 용량과 빠른 속도를 가지는 JDBC의 커넥션 풀 프레임워크이다.
SpringBoot는 커넥션 풀 관리를 위해 HikariCP를 사용한다.

1. 커넥션 풀 동작원리

  1. Thread가 커넥션을 요청했을 때 유휴 커넥션이 존재한다면 해당 커넥션을 반환해준다.

  2. 유휴 커넥션이 존재하지 않는다면, HandOffQueue를 Polling 하면서 다른 Thread가 커넥션을 반납하기를 기다린다.

  • 다른 Thread가 커넥션 풀에 커넥션을 반납하면
  • 커넥션 풀은 HandOffQueue에 반납된 커넥션을 삽입하고
  • HandOffQueue를 Polling 하던 Thread는 커넥션을 획득하게 된다.
  • 만약 커넥션 풀의 크기가 너무 작다면, 커넥션을 획득하기 위해 대기하고 있는 Thread가 많아지게 될 것이다.

이러한 문제는 커넥션 풀의 크기를 늘려주면 해결할 수 있다.
그렇다면 커넥션 풀의 크기는 어느 정도인 게 좋을까?

2. 커넥션 풀의 크기와 성능

🤔 커넥션 풀이 크면 클수록 좋을까?

Connection을 사용하는 주체인 Thread의 개수보다 커넥션 풀의 크기가 크다면 사용되지 않고 남는 커넥션이 생겨 메모리의 낭비가 발생하게 된다.

MySQL

공식레퍼런스에서는 600여 명의 유저를 대응하는데 15~20개의 커넥션 풀만으로도 충분하다고 언급하고 있다.
MySQL은 최대 연결 수를 무제한으로 설정한 뒤 부하 테스트를 진행하면서 최적화된 값을 찾는 것을 추천한다.

우아한 형제들 테크 블로그

Tn = 전체 Thread의 개수
Cm = 하나의 Task에서 동시에 필요한 Connection 수

DB와 WAS의 Context Switching 역시 한계가 있기 때문에 Thread Pool의 크기는 Conncetion Pool의 크기를 결정하는데 매우 중요하다.


위의 내용은 참고블로그를 보고 정리했다.


+ 데드락

  • 내가 HikariCP를 기억하는건 에러 메세지, 데드락 때문이다.
  • 대용량 처리시 성능을 고려하지 못한 설계로 지정된 응답시간을 넘기고 락걸려서 종료되곤 하였다.
  • 개발하다가 만나게 되면 아래 링크를 참고하여 해결해야겠다.
    참고링크
profile
공부중인 주니어 개발자

0개의 댓글