1. Issue (현상)

  • Cloud Run 배포 시 컨테이너가 8080 포트 준비 전에 DB 연결 실패로 종료
  • 로컬 실행에서도 동일 에러 발생
  • DBeaver에서도 Direct Connection 연결 불가
FATAL: Max client connections reached
Unable to obtain isolated JDBC connection
Unable to determine Dialect without JDBC metadata

2. Root Cause (원인)

  1. Supabase 프로젝트의 Direct Connection 이 IPv6 Only (Supabase 콘솔 메시지 : Not IPv4 compatible ) → Use Session Pooler
  2. Cloud Run, 로컬 개발 환경, DBeaver 모두 IPv4 기반 → Direct host(db.xxx.supabase.co)로는 TCP 연결 자체가 불가능.
  3. Spring Boot이 Direct URL을 사용하고 있었음

그 결과

  1. 앱 부팅 시 Hibernate 초기화를 위해 여러 DB connection 생성
  2. Direct 연결이 차단되어 Pooler로 우회됨
  3. Pooler가 가진 max_client_connections 제한 초과
  4. Supavisor(PgBouncer)가 즉시 오류 발생:
FATAL: Max client connections reached

결과적으로 Direct 연결이 지원되지 않는 환경인데 Direct URL을 사용한 것이 핵심 원인

3. Solution (해결 방법)

  1. Supabase에서 “Session Pooler” URL 사용, Spring Boot JDBC URL을 Pooler로 교체 Supabase → Database → Connection Strings Source: Primary Database Method: Session Pooler
SPRING_DATASOURCE_URL=jdbc:postgresql://aws-0-xxx.pooler.supabase.com:5432/postgres
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=xxxxxx
  1. Hikari Pool 설정을 매우 낮게 설정
spring.datasource.hikari.maximum-pool-size=3
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.connection-timeout=5000
spring.datasource.hikari.validation-timeout=2000
  1. Cloud Run 인스턴스 수는 1~2개로 최소화