DB

[MySQL] (연결최적화6️⃣) 실무 연결 설정 체크리스트 총정리

인생아 2025. 7. 19. 00:43
반응형

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과 애플리케이션 간 연결은 단순한 설정 몇 줄로 끝나는 게 아니다.
풀 크기, 타임아웃, 누수 방지, 트랜잭션 전략까지 유기적으로 설계하고 관리해야 시스템의 안정성을 높일 수 있다.
이 체크리스트를 기준으로 현 시스템의 연결 설정을 점검해보자.

📘 공식 문서 참고

 

반응형