Runtime Connection Pool 오류

Kim jisu·2025년 7월 26일
0

 Debugging Note

목록 보기
34/37

🐞 Runtime Connection Pool 오류 디버깅 리포트

🔍 문제 현상

  • 웹 페이지 접속 시 Runtime 예외 발생

    Unable to acquire JDBC Connection 
    [HikariPool-1 - Connection is not available, request timed out after 20000ms]
  • 장애 현상 요약:

    • 접속 지연 및 오류로 사용자 요청 처리 불가
    • 서버 로그에 커넥션 풀 고갈 메시지 다수 출력

💸 원인 분석 및 배경

🔄 RDS → Supabase 전환

  • 운영 비용 절감을 위해 기존 AWS RDS PostgreSQL 인스턴스를 Supabase의 호스팅 PostgreSQL 인스턴스로 전환
  • Supabase는 기본적으로 **connection max 수(기본 20)**가 제한적이며, 사용량 급증 시 제약 발생

⚠️ 최초 발생한 이슈

  • Supabase PostgreSQL의 커넥션 수 제한 초과
  • connection limit exceeded for non-superusers 오류 발생
  • 원인: 초당 수십 개의 동시 요청 + long-lived 커넥션이 종료되지 않음

⚙️ 조치: HikariCP 커넥션 풀 조정

spring:
  datasource:
    hikari:
      maximum-pool-size: 20 → 30
      minimum-idle: 10 → 5
      connection-timeout: 20000 → 30000
      validation-timeout: 5000
      leak-detection-threshold: 60000

✅ 적용된 수정 요약

🧠 핵심 원인: 트랜잭션 외부의 DB 접근

  • 일부 JPA Repository 사용 코드가 @Transactional 없이 실행
  • Supabase는 커넥션 timeout 정책이 엄격해 커넥션 미반환 시 치명적

🔧 주요 수정 사항:

  1. KakaoService.createNewUserFromKakao()
    @Transactional(readOnly = true) 추가로 커넥션 자동 반환 유도
  2. SggCodeController.findAll()
    → 모든 API에 @Transactional(readOnly = true) 명시
  3. findAll()findAll(PageRequest.of(0, 1))로 메모리 과점 유발 방지

📈 시스템 구성 변경 전/후 비교

항목변경 전변경 후
DB 엔진AWS RDS (PostgreSQL)Supabase PostgreSQL
Max Connection50+약 20 (플랜 제약)
Hikari 최대 풀 크기2030
유휴 커넥션105
Leak 감지미설정60초 감지

🔍 진단 및 검증 로그 모니터링

  • 커넥션 풀 상태 로그 활성화

    spring.datasource.hikari.pool-name=HikariPool-1
    logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
    logging.level.com.zaxxer.hikari=DEBUG
  • SQL 쿼리 실행 시 바인딩된 파라미터 포함

    spring.jpa.properties.hibernate.format_sql=true
    spring.jpa.show-sql=true
    spring.jpa.properties.hibernate.type=trace
  • 누수 탐지 로그 예시

    HikariPool-1 - Connection leak detection triggered for connection ... held for 62234ms

🧪 검증 시나리오

시나리오기대 결과
/auth/login/kakao 요청커넥션 반환 확인, leak 로그 없음
/api/sgg-codes 다중 호출커넥션 풀이 재사용됨, 타임아웃 없음
대량 요청 시 커넥션 수 증가max 30 내에서 순환 처리

🎯 결론 및 운영 전략

  • Supabase로 전환 후 발생한 동시 접속 한계 문제를 커넥션 풀 조정 + 트랜잭션 명확화로 해결
  • Spring JPA의 커넥션 관리 정책을 준수하면서도 readOnly 트랜잭션 적용을 통해 커넥션 반환 명시화
  • 커넥션 풀 상태/쿼리/누수에 대한 진단 로그 활성화로 모니터링 체계 구축 완료
profile
Dreamer

0개의 댓글