데이터베이스 커넥션 풀(Connection Pool)을 사용하지 않으면 어떤 문제가 발생할 수 있나요?
Connection
이라는 연결 통로가 필요하다.1. 비싼 비용💸
2. 제한된 커넥션 수🚫
Connection refused
, Too many connections
)Connection Pool
이다.HikariCP
- 자주봤죵~?maximumPoolSize
: 풀에 유지할 최대 커넥션 수minimumIdle
: 유휴 상태로 유지할 커넥션 수connectionTimeout
: 커넥션을 못 얻어올 떄까지 기다릴 최대 시간idleTimeout
: 유휴 커넥션을 얼마나 오래 유지할지maxLifetime
: 커넥션 객체가 살아있을 수 있는 최대 시간💡 커넥션 유휴 상태란 DB 커넥션이 열려있지만, 아무 작업도 하지 않는 대기 상태
Hikari Pool - Connection timeout
, connection leak detected
경고TCP
소켓 연결DB
인증max_connections
)가 제한됨Too many connections
오류로 서비스 전체 장애❗ 이 외에도 커넥션 풀을 사용하지 않아 커넥션을 관리하지 않으면
확장성(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 + 세션 │ │
│ └───────────┘ └───────────┘ └───────────┘ │
└─────────────────────────────────────────┘
▲ ▲
| |
요청 시 꺼내서 사용 요청 끝나면 반환
DB 세션을 공부해야겠다 ..!