Skip to content

[Test] Integration Test에서 MySQL Too many connections 발생 #840

@YuyoungRhee

Description

@YuyoungRhee

📌 문제 요약

Integration Test 실행 중 간헐적으로 다음 오류 발생:

java.sql.SQLNonTransientConnectionException:
Too many connections

재실행 시 다른 테스트가 실패하며 반복적으로 발생.

📊 현재 구조 분석

1️⃣ 테스트 구성

  • @DataJpaTest 기반 테스트 다수
  • 일부는 @SpringBootTest
  • Redis Testcontainers 사용
  • MySQL은 외부 서버 공유 사용
  • master/replica DataSource 2개 구성

2️⃣ 컨텍스트 분리 문제

테스트마다 @import 구성 차이로 인해

Spring ApplicationContext가 분리 생성됨.

현재:

  • 총 5개의 서로 다른 Spring Context
  • 각 Context마다:
    • master HikariPool
    • replica HikariPool

3️⃣ 커넥션 계산

기본 Hikari 설정 (maxPoolSize=10) 기준:

5 Context × 2 DataSource × 10 connections
= 최대 100개 커넥션 요청
  • Flyway/JPA 초기화 스파이크 발생

→ MySQL max_connections 초과

🎯 근본 원인

  • 테스트 컨텍스트 과다 생성
  • DataSource 2개 구조
  • Hikari 기본 풀 크기 과도
  • 외부 MySQL 공유 사용
  • 컨텍스트 초기화 시 동시 커넥션 스파이크

Redis는 직접 원인이 아니라

초기화 지연으로 인해 커넥션 점유 시간을 증가시키는 간접 요인.

✅ 해결 방향

1️⃣ HikariCP 테스트 전용 설정 축소

maximum-pool-size=2
minimum-idle=0

→ 커넥션 상한 구조적으로 제한

2️⃣ Integration Test 컨텍스트 통합

목표:

5 Context → 1 Context

3️⃣ 트랜잭션 전략

  • @transactional 사용하지 않음
  • @SQL 기반 DB 초기화 유지
  • 운영 환경과 동일한 트랜잭션 동작 보장

📈 기대 효과

  • MySQL 커넥션 고갈 문제 제거
  • 컨텍스트 초기화 1회로 감소
  • 테스트 코드 중복 제거
  • 유지보수성 향상
  • 실제 운영 환경과 동일한 통합 테스트 구조 확보

🔥 핵심 요약

Integration Test에서 컨텍스트 과다 생성으로 인해

HikariPool이 중첩 생성되며 MySQL 커넥션 제한을 초과함.

Hikari 풀 축소 + @SpringBootTest 기반 컨텍스트 통합으로 구조적 해결 진행.

Metadata

Metadata

Assignees

Labels

BE백엔드 파트🚧 test테스트 필요 시 추가

Type

Projects

Status

No status

Relationships

None yet

Development

No branches or pull requests

Issue actions