DB

[MySQL] (연결최적화2️⃣) 커넥션 풀의 개념과 실무 설정 가이드

인생아 2025. 7. 18. 20:32
반응형

MySQL을 사용하는 Java 애플리케이션에서는 매번 DB에 새로 연결하면 큰 성능 저하가 발생한다.
이때 반드시 필요한 것이 바로 커넥션 풀(Connection Pool)이다.
이 글에서는 커넥션 풀의 기본 개념부터 HikariCP 실무 설정 예시까지 자세히 정리한다.

💡 커넥션 풀이란?

커넥션 풀은 DB 연결(Connection)을 미리 만들어두고 재사용하는 기법이다.
사용자 요청이 들어올 때마다 새로 연결하는 것이 아니라,
미리 확보한 연결 중 하나를 빌려주고 사용 후 다시 반납하는 구조다.

커넥션 풀의 핵심 이점

  • 성능 향상: 연결 생성/해제 비용 감소
  • 안정성 향상: 커넥션 수 제한으로 DB 과부하 방지
  • 재사용 가능: 매번 연결하지 않아 애플리케이션 부하 감소
반응형

🔧 대표적인 커넥션 풀 종류

커넥션 풀 특징
HikariCP Spring Boot 기본값, 경량/고성능, 설정 단순
Tomcat JDBC Tomcat 내장, 유연한 설정 가능
Apache DBCP2 다양한 설정 지원, 다소 무거움
c3p0 예전부터 쓰이던 방식, 최근엔 사용 줄어듦

실무에서는 대부분 HikariCP를 사용한다. 빠르고 안정적이며 Spring Boot와 궁합이 좋다.

⚙️ HikariCP 실무 설정 예시

application.yml 예시:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Seoul
    username: myuser
    password: mypass
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      idle-timeout: 600000
      max-lifetime: 1800000
      connection-timeout: 30000
      pool-name: MyHikariPool

주요 옵션 설명

옵션명 의미
maximum-pool-size 동시에 유지할 최대 커넥션 수 (기본: 10)
minimum-idle 최소한 유지할 유휴 커넥션 수
idle-timeout 유휴 커넥션을 회수할 시간(ms)
max-lifetime 커넥션의 최대 수명 (DB의 wait_timeout보다 짧게 설정)
connection-timeout 커넥션 가져오기 대기 시간 초과(ms)
pool-name 로그에 표시될 풀 이름

🧪 커넥션 풀 튜닝 실전 팁

  • 사용자 수가 많을수록 maximum-pool-size를 늘려야 한다
  • max-lifetime은 MySQL의 wait_timeout보다 짧게 설정 (예: 30분 = 1800000ms)
  • HikariCP는 내부적으로 FastPath + ConcurrentBag 구조로 성능이 매우 우수함
  • 커넥션 누수를 방지하려면 Connection을 반드시 close() 해야 함
반응형

🧠 커넥션 풀 동작 흐름 이해

  1. 서버 시작 시 커넥션 풀은 최소 개수만큼 연결을 확보
  2. 사용자가 DB 접근 시 사용 가능한 커넥션을 할당
  3. 사용 후 반납되면 커넥션 풀로 돌아감
  4. 커넥션 수요가 급증하면 최대 수까지 자동 증가
  5. 유휴 상태가 길면 자동으로 커넥션이 회수됨

🚫 실무에서 흔한 오류

문제 원인 해결책
Too many connections 커넥션 풀 사이즈 과다 또는 커넥션 미반납 close() 누락 여부 점검, max pool 사이즈 조정
Connection is closed 오류 max-lifetime이 wait_timeout보다 큼 max-lifetime을 더 짧게 설정
DB 부하 급증 모든 커넥션이 활성화됨 minimum-idle 설정 조절, 쿼리 최적화

✅ 정리 요약

  • 커넥션 풀은 고성능 애플리케이션의 기본 인프라
  • Spring Boot에서는 HikariCP가 가장 보편적이고 빠름
  • 튜닝 포인트는 maximum-pool-size, max-lifetime, connection-timeout
  • 커넥션 누수 방지를 위한 코드 습관이 가장 중요함

다음 글에서는 커넥션 타임아웃 설정 및 오류 해결법을 다룰 예정이니 연결해서 보면 좋다.

📘 공식 문서 참고

https://github.com/brettwooldridge/HikariCP

반응형