HikariCP 커넥션 풀 고갈로 인한 문제 대응

N’oublie pas de t’aimer·2025년 2월 4일

DIVE

목록 보기
1/10
post-thumbnail

영상 -> 음성 변환 메소드 배포 이후, 네이버 로그인 기능이 정상적으로 작동하지 않는 문제가 발생했다. 로그를 분석한 결과 다음과 같은 오류 메시지가 확인되었다.

SQL Error: 0, SQLState: null HikariPool-1 - Connection is not available, request timed out after 30001ms (total=0, active=0, idle=0, waiting=0)
항목의미
SQL Error: 0JDBC 레벨의 SQL 에러 코드. 0은 SQL 문 자체의 문제라기보단 커넥션 풀 등 외부 요인에서 발생한 예외임을 의미함.
SQLState: nullSQL 표준 상태 코드. null이면 SQL 스펙의 에러가 아니라 드라이버 또는 풀 내부에서 발생한 예외일 가능성이 높음.
HikariPool-1해당 오류가 발생한 HikariCP 커넥션 풀의 이름. 기본 설정에서는 HikariPool-1이 자동으로 지정됨.
Connection is not available현재 커넥션 풀에 사용 가능한 커넥션이 없어 할당할 수 없는 상태.
request timed out after 30001ms커넥션을 얻기 위해 최대 30초 동안 대기했지만 커넥션을 확보하지 못해 타임아웃된 상태.
total=0커넥션 풀에 존재하는 총 커넥션 수가 0. 커넥션 생성 실패, 반환 누락, DB 연결 문제 등으로 인해 발생 가능.
active=0현재 사용 중인(active) 커넥션 수. 0이므로 사용 중인 커넥션 없음.
idle=0즉시 할당 가능한 유휴 커넥션 수. 없음.
waiting=0커넥션을 기다리는 쓰레드 수. 타임아웃 직후 상태이므로 0. 실제로는 요청 당시 대기 쓰레드가 존재했을 가능성 있음.

이는 HikariCP 커넥션 풀 내에서 사용 가능한 커넥션이 전혀 없는 상태에서 커넥션 요청이 일정 시간 내에 처리되지 않아 발생한 타임아웃 예외다.

HikariCP(Hikari Connection Pool)는 Java 기반 웹 애플리케이션에서 데이터베이스 커넥션 풀(Connection Pool)을 관리하기 위한 라이브러리다.
Spring Boot에서는 기본 데이터소스 커넥션 풀로 HikariCP를 채택하고 있다 (2.0 이상부터 기본값).

커넥션 풀(Connection Pool)이란?

  • 웹 애플리케이션이 DB에 접근할 때마다 커넥션을 새로 열고 닫는다면 성능 저하가 심해진다.
  • 그래서 미리 일정 수의 DB 커넥션을 만들어 풀(Pool)에 보관해두고, 필요할 때 꺼내 쓰고 다시 반납하는 구조가 커넥션 풀이다.
  • 이렇게 하면 커넥션 생성/소멸 비용을 줄이고, 동시 요청에도 효율적으로 대응할 수 있다.

HikariCP의 특징

항목내용
성능업계 최고 수준의 속도와 경량성. 벤치마크상 가장 빠른 커넥션 풀 중 하나로 평가됨.
최소 설정별도 설정 없이도 기본값으로 안정적으로 동작함.
JDBC4 이상 지원JDBC4, 4.1, 4.2 이상을 공식 지원.
모니터링커넥션 사용량, 누수 추적, 풀 상태 등 모니터링 기능 내장.
Spring Boot 통합spring-boot-starter-data-jpa, spring-boot-starter-jdbc 등을 사용할 경우 자동으로 적용됨.

주요 설정 예시 (application.yml 기준)

spring:
  datasource:
    hikari:
      maximum-pool-size: 20        # 최대 커넥션 수
      minimum-idle: 5              # 최소 유휴 커넥션 수
      idle-timeout: 600000         # 유휴 커넥션 유지 시간 (기본: 10분)
      connection-timeout: 30000    # 커넥션 요청 시 최대 대기 시간 (기본: 30초)
      max-lifetime: 1800000        # 커넥션의 최대 생존 시간 (기본: 30분)

total=0, active=0, idle=0 이므로 풀에 등록된 커넥션 자체가 존재하지 않거나, 생성된 커넥션들이 예외 발생 등으로 인해 소멸되어 유실된 것으로 추정된다. 이 경우 커넥션 풀은 새로운 커넥션을 생성하지 않거나, 생성이 지연되고, 동시에 들어오는 커넥션 요청을 처리할 수 없게 된다.

가능한 원인 중 하나는 maximumPoolSize 값이 기본값인 10으로 설정되어 있어, 음성 변환 메소드 등에서 지속적으로 DB 커넥션을 점유하고 반환하지 않는 구조로 인해 커넥션이 고갈되었을 가능성이다.

이에 다음과 같이 설정을 수정하였다.

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5

maximum-pool-size를 20으로 확장하였다. 해당 설정 반영 후 재실행하자, 네이버 로그인 기능이 정상적으로 작동하였다.

이 문제를 통해, 커넥션 풀 설정은 단순히 수치를 조정하는 수준을 넘어, 서비스 구조와 트래픽 특성에 맞춰 신중하게 설계되어야 한다는 점을 확인할 수 있었다. 특히 비동기 처리, 외부 API 연동, 대량의 트랜잭션이 발생하는 메소드가 존재하는 경우, 커넥션 풀 사용 전략을 재점검할 필요가 있다.

profile
매일 1퍼센트씩 나아지기 ୧(﹒︠ ̫ ̫̊ ̫﹒︡)୨

0개의 댓글