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 (원인)
- Supabase 프로젝트의 Direct Connection 이 IPv6 Only (Supabase 콘솔 메시지 : Not IPv4 compatible ) → Use Session Pooler
- Cloud Run, 로컬 개발 환경, DBeaver 모두 IPv4 기반 → Direct host(
db.xxx.supabase.co)로는 TCP 연결 자체가 불가능. - Spring Boot이 Direct URL을 사용하고 있었음
그 결과
- 앱 부팅 시 Hibernate 초기화를 위해 여러 DB connection 생성
- Direct 연결이 차단되어 Pooler로 우회됨
- Pooler가 가진
max_client_connections제한 초과 - Supavisor(PgBouncer)가 즉시 오류 발생:
FATAL: Max client connections reached
결과적으로 Direct 연결이 지원되지 않는 환경인데 Direct URL을 사용한 것이 핵심 원인
3. Solution (해결 방법)
- 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- 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- Cloud Run 인스턴스 수는 1~2개로 최소화