-
Notifications
You must be signed in to change notification settings - Fork 5
Description
📌 문제 요약
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 컨텍스트 통합
- @SpringBootTest 기반 통합 테스트 구조 도입
- 공통 Base 클래스 생성
- Redis Testcontainer 공유 (@container static)
- @import 제거
목표:
5 Context → 1 Context
3️⃣ 트랜잭션 전략
- @transactional 사용하지 않음
- @SQL 기반 DB 초기화 유지
- 운영 환경과 동일한 트랜잭션 동작 보장
📈 기대 효과
- MySQL 커넥션 고갈 문제 제거
- 컨텍스트 초기화 1회로 감소
- 테스트 코드 중복 제거
- 유지보수성 향상
- 실제 운영 환경과 동일한 통합 테스트 구조 확보
🔥 핵심 요약
Integration Test에서 컨텍스트 과다 생성으로 인해
HikariPool이 중첩 생성되며 MySQL 커넥션 제한을 초과함.
Hikari 풀 축소 + @SpringBootTest 기반 컨텍스트 통합으로 구조적 해결 진행.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
No status