[매일메일CS] 데이터베이스 커넥션 풀(Connection Pool)

Euiyeon Park·2025년 7월 31일
0

매일메일 CS

목록 보기
1/3
post-thumbnail

데이터베이스 커넥션 풀(Connection Pool)을 사용하지 않으면 어떤 문제가 발생할 수 있나요?

🔗 데이터베이스 커넥션

  • 서버는 DB와 통신할 때 Connection 이라는 연결 통로가 필요하다.
  • 즉, 커넥션은 애플리케이션 서버와 데이터베이스 사이의 통신선
  • 커넥션을 통해 SQL 쿼리를 전송하고 결과를 받아온다.
  • 애플리케이션과 DB 사이의 연결 세션으로, 쿼리를 보내고 응답을 받기 위한 통신 통로
  • 하나의 커넥션은 DB와의 TCP 커넥션 + 세션 컨텍스트를 의미한다.(TCP + DB 세션 연결)
  • 커넥션을 열고 닫는 데는 네트워크 연결, 인증, 세션 설정 등의 작업으로 비용이 크다.

커넥션의 특징과 문제점

1. 비싼 비용💸

  • 매 요청 마다 커넥션을 열고 닫으면, DB와 네트워크에 부하가 크다.

2. 제한된 커넥션 수🚫

  • DB 서버는 동시에 처리할 수 있는 커넥션 수가 정해져 있어,
    웹 서버 트래픽이 몰릴 때 커넥션이 부족한 문제가 발생할 수 있다.
    (Connection refused, Too many connections)

🔗 커넥션 풀

  • 커넥션의 특징/문제점으로 인해 필요한 개념이 Connection Pool이다.
  • 커넥션 풀은 미리 커넥션을 만들어두고 재사용해서 커넥션 생성/삭제 비용을 줄이고,
    커넥션 수를 안정적으로 관리
    하는 방식이다.
  • 대표적인 구현체로는 Java/Spring의 HikariCP - 자주봤죵~?

커넥션 풀 주요 설정

  • maximumPoolSize : 풀에 유지할 최대 커넥션 수
  • minimumIdle : 유휴 상태로 유지할 커넥션 수
  • connectionTimeout : 커넥션을 못 얻어올 떄까지 기다릴 최대 시간
  • idleTimeout : 유휴 커넥션을 얼마나 오래 유지할지
  • maxLifetime : 커넥션 객체가 살아있을 수 있는 최대 시간

💡 커넥션 유휴 상태란 DB 커넥션이 열려있지만, 아무 작업도 하지 않는 대기 상태

커넥션 풀 작동 방식

  • 서버 시작 시 DB 커넥션을 미리 일정 개수 열어둠
  • HTTP 요청이 들어오면 풀에서 커넥션을 꺼내서 사용
  • 처리 후 커넥션을 닫는게 아니라 풀에 반환

커넥션 누수

  • 커넥션을 반환하지 않으면 누수가 발생해 커넥션 고갈 문제 발생
  • 이슈 발생 시 Hikari Pool - Connection timeout, connection leak detected 경고

🍀 커넥션 풀을 사용하지 않는다면?

1. 매 요청마다 커넥션 생성/종료 → 성능저하

  • 커넥션 생성 과정
    1. TCP 소켓 연결
    2. DB 인증
    3. 세션 초기화
  • 이 과정은 수 ms ~ 수백 ms 걸릴 수 있는 과정
  • 매 HTTP 요청마다 이 과정을 반복하면 응답 속도가 급격히 느려짐
  • TPS가 떨어져서 같은 서버 성능으로 처리할 수 있는 요청 수 감소

2. DB 부하 증가

  • 매번 커넥션을 새로 만들면 DB 서버는 계속 새 세션을 생성/삭제해야 함
  • 세션 생성/삭제도 DB의 CPU, 메모리 자원을 많이 소모
  • 동시에 수백~수천 요청이 들어오면 DB가 세션 생성 처리만 하다가 병목 발생

3. 커넥션 폭주 & 제한 초과

  • DB는 동시 접속 수(max_connections)가 제한됨
  • 커넥션 풀 없이 무제한 생성은 순간적으로 DB 동시 접속 한도를 초과
  • 결과적으로 Too many connections 오류로 서비스 전체 장애

4. 커넥션 재사용 불가 → 리소스 낭비

  • 커넥션은 만들기 비싼 자원인데, 매번 만들고 바로 버리면 낭비
  • 풀을 쓰면 한 번 만든 커넥션을 여러 요청이 재사용 가능
  • 재사용이 없으면 네트워크, DB, CPU 낭비 + 응답속도 지연

❗ 이 외에도 커넥션 풀을 사용하지 않아 커넥션을 관리하지 않으면
확장성(Scalability) 문제, 장애 복구 및 안정성 저하 문제를 초래할 수 있음

정리

매일메일 스터디에서 커넥션 타임아웃(Connection Timeout)과 관련된 질문을 받았을 때,
명확한 답변을 하지 못했는데, 그 이유는 커넥션을 DB에 중점을 두고 생각했기 때문이다.

커넥션은 애플리케이션과 DB간의 통신선이라고 위에서 정리했는데,
그 통신의 기반이 TCP라는 부분을 간과했던 것 같다.

다시 정리하자면,

커넥션 = 애플리케이션 ↔ DB 간의 통신선
DB 커넥션은 TCP 연결 + DB 세션 상태까지 포함한 개념
애플리케이션과 DB의 통신 기반은 TCP(TCP 소켓 연결)

[애플리케이션]                  [DB 서버]
    |                               |
    | 1. TCP 연결 (소켓 open)       |
    |------------------------------>|
    |                               |
    | 2. DB 인증 & 세션 생성        |
    |------------------------------>|
    |                               |
    | ← 커넥션(=TCP + 세션) -------- |
    |                               |
    ▼                               ▼
 ┌─────────────────────────────────────────┐
 │             커넥션 풀(Connection Pool)  │
 │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
 │ │Conn #1    │ │Conn #2    │ │Conn #3    │ │  ← 미리 만든 커넥션들
 │ │TCP + 세션 │ │TCP + 세션 │ │TCP + 세션 │ │
 │ └───────────┘ └───────────┘ └───────────┘ │
 └─────────────────────────────────────────┘
         ▲                 ▲
         |                 |
   요청 시 꺼내서 사용   요청 끝나면 반환
   

NEXT STEP

DB 세션을 공부해야겠다 ..!

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글