반응형
MySQL과 애플리케이션이 안정적으로 연결되기 위해서는 커넥션 풀, 트랜잭션, 타임아웃 등 다양한 요소의 설정이 조화를 이루어야 한다.

✅ 1. JDBC URL 파라미터 확인
- autoReconnect=false : 자동 재연결 대신 장애 감지 추천
- useSSL=true : 데이터 전송 보안 적용 여부
- connectTimeout=30000 : 연결 시도 제한 시간
- socketTimeout=60000 : 응답 대기 시간 제한
- characterEncoding=UTF-8 : 문자 인코딩 명시
- allowPublicKeyRetrieval=true : 로컬 개발 환경에서 필요한 경우 있음
예시
jdbc:mysql://localhost:3306/mydb?useSSL=true&connectTimeout=30000&socketTimeout=60000&characterEncoding=UTF-8
반응형
✅ 2. HikariCP 설정 포인트
| 설정 항목 | 설명 | 추천값 예시 |
| maximumPoolSize | 최대 커넥션 수 | 트래픽 기준 20~100 |
| connectionTimeout | 커넥션 획득 대기 시간 | 30초 (30000) |
| idleTimeout | 유휴 커넥션 제거 시간 | 10분 (600000) |
| maxLifetime | 커넥션 최대 수명 | 30분 (1800000) |
| leakDetectionThreshold | 커넥션 누수 감지 | 3~5초 |
설정 예시 (Spring Boot)
spring:
datasource:
hikari:
maximum-pool-size: 30
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
leak-detection-threshold: 5000
✅ 3. 트랜잭션 전파 및 커넥션 전략
- 메인 트랜잭션은 REQUIRED로 묶고, 부가 작업은 REQUIRES_NEW로 분리
- 서비스 계층에서는 DB 커넥션 직접 사용 금지 → Repository 계층에서만 관리
- @Transactional 애너테이션 누락 주의
- 트랜잭션 전파 방식에 따라 커넥션 추가 할당 여부 확인 필요
✅ 4. 커넥션 타임아웃과 서버 설정
- wait_timeout, interactive_timeout: 서버 측 유휴 연결 시간 제한
- Spring maxLifetime은 이보다 짧게 설정해야 함
- 무한대 설정보다 일정 시간 뒤 끊기게 하는 것이 안전
MySQL 설정 예시 (my.cnf)
wait_timeout = 600
interactive_timeout = 600
반응형
✅ 5. 커넥션 누수 방지 팁
- try-with-resources 문법 적극 활용 (Java 7+)
- 누수 감지용 leakDetectionThreshold 반드시 설정
- 커넥션을 서비스 계층에 전달하지 않도록 설계
- 쿼리 실행 중 예외 발생 시에도 close() 보장 필요
✅ 6. 연결 모니터링 도구 활용
- Spring Boot Actuator: /actuator/metrics/hikaricp.connections.active
- MySQL SHOW PROCESSLIST → Sleep 커넥션 점검
- VisualVM, JConsole 등으로 GC와 함께 리소스 상태 관찰
🔚 결론
MySQL과 애플리케이션 간 연결은 단순한 설정 몇 줄로 끝나는 게 아니다.
풀 크기, 타임아웃, 누수 방지, 트랜잭션 전략까지 유기적으로 설계하고 관리해야 시스템의 안정성을 높일 수 있다.
이 체크리스트를 기준으로 현 시스템의 연결 설정을 점검해보자.
📘 공식 문서 참고
- https://github.com/brettwooldridge/HikariCP
- https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] 문자열 검색 함수: INSTR, LOCATE, POSITION 비교 (0) | 2025.07.19 |
|---|---|
| [MySQL] 문자열 추출 함수: LEFT, RIGHT, SUBSTRING 정리 (0) | 2025.07.19 |
| [MySQL] 문자열 연결 함수: CONCAT, CONCAT_WS 활용법 (0) | 2025.07.19 |
| [MySQL] 문자열 길이 함수: LENGTH vs CHAR_LENGTH 정리 (3) | 2025.07.19 |
| [MySQL] (연결최적화5️⃣) 커넥션 누수 원인 진단과 해결 전략 (1) | 2025.07.18 |
| [MySQL] (연결최적화4️⃣) 트랜잭션 전파 방식과 커넥션 이슈 분석 (0) | 2025.07.18 |
| [MySQL] (연결최적화3️⃣) 커넥션 타임아웃 설정과 오류 해결법 (0) | 2025.07.18 |
| [MySQL] (연결최적화2️⃣) 커넥션 풀의 개념과 실무 설정 가이드 (0) | 2025.07.18 |