커넥션 풀(Connection Pool)이란?
- Client의 요청에 따라 각 Application의 Thread에서 DB에 접근하기 위해서는 Connection이 필요합니다.
- 커넥션 풀은, 미리 일정 수의 Connection을 생성해 Pool에 보관해 두는 것을 의미합니다.
Connection Pool의 필요성
- 요청이 올 때마다 Connection을 생성하는 방식은, 연결량이 많을 때 서버에 과부하 발생하지만, 이를 미리 만들어 Pool에 저장하면 이러한 현상을 방지할 수 있습니다.
- 커넥션 풀을 사용하면, 생성/소멸에 드는 시간을 줄이고 커넥션 수를 제어하여 효율적이며, Application이 쉽게 죽지 않습니다.
Connection Pool의 동작 방식
1. 애플리케이션에서 데이터베이스 커넥션이 필요할 경우, 커넥션 풀은 사전에 생성된 유휴 커넥션(idle connection) 중 하나를 즉시 할당합니다.
2. 클라이언트 요청 처리가 완료되면, 해당 커넥션은 실제로 종료(close)되지 않고 커넥션 풀에 반환(return)되어 재사용 가능한 상태로 전환됩니다.
3. 만약 모든 커넥션이 사용 중이라면, 커넥션 풀은 설정된 최대 대기 시간(maxWaitTime)동안 스레드를 블로킹(blocking)시키며 유휴 커넥션이 반환되기를 기다립니다. 대기 시간이 초과되면 예외를 발생시키거나, 설정에 따라 새 커넥션을 생성할 수도 있습니다.
커넥션 풀과 스레드 풀(Thread Pool)의 차이와 공통점
- 커넥션 풀과 스레드 풀은 모두 리소스를 미리 확보해 두고 재사용하는 성능 최적화 기법입니다. 다만 대상과 목적이 다릅니다.
스레드 풀
- 스레드 풀은 동시 요청을 처리할 수 있는 실행 단위(스레드)를 재사용하는 구조입니다. (작업처리)
- 이는 주로 비동기 작업 처리나 웹 요청 응답에서 활용됩니다.
커넥션 풀
- 커넥션 풀은 DB와의 연결 객체를 재사용는 구조입니다. (데이터베이스 연결)
- 이는 데이터베이스와의 통신에서 반복되는 연결 비용을 줄이는데 중점을 둡니다.
커넥션 풀 구현체 비교: HikariCP vs DBCP vs C3P0
- Java 기반 애플리케이션에서 널리 사용되는 커넥션 풀 구현체로는 HikariCP, Apache DBCP, C3P0가 있습니다.
HikariCP
- HikariCP는 경량과 고성능을 목표로 만들어진 최신 커넥션 풀입니다.
- 최소한의 기능에 집중하며 내부적으로 매우 빠른 처리 루틴을 갖고 있어 Spring Boot 2.x 이후 기본 커넥션 풀로 채택되었습니다.
- 빠른 응답성과 낮은 지연시간이 강점입니다.
DBCP (Database Connection Pool)
- Apache Commons 프로젝트에서 제공하는 안정적인 커넥션 풀입니다.
- 기능은 충분하지만 속도 면에서는 HikariCP보다 느리고, 설정 난이도도 약간 더 높은 편입니다.
- 예전에는 가장 많이 사용되었으며, 여전히 안전성을 이유로 일부 프로젝트에서 사용됩니다.
C3P0
- 과거 Hibernate와 함께 널리 사용되던 풀입니다.
- 자동 재시도 기능이나 다양한 설정을 제공합니다. 단 성능 이슈와 버그 이슈로 최근에는 사용이 줄어들고 있습니다.
- 특히 대규모 트래픽 환경에서는 커넥션 획득 지연 및 풀 관리 효율성 문제로 인해 비효율적입니다.
Spring Boot에서 커넥션 풀 설정 시 주의할 점
항목기능 | 설명 | 주의 포인트 |
maximum-pool-size | 동시에 사용 가능한 최대 커넥션 수를 설정 | - 서버 수와 트래픽에 맞게 설정하고, 과도하게 크거나 작지 않도록 조정해야 합니다. |
max-lifetime | 커넥션 하나가 최대 사용할 수 있는 시간 | - DB의 wait_timeout보다 작게 설정해 강제 종료로 인한 오류를 방지해야 합니다. |
idle-timeout | 커넥션이 유휴 상태로 유지될 수 있는 시간 | - 유휴 커넥션이 과도하게 유지되지 않도록 설정해야 합니다. |
validationQuery / testOnBorrow |
커넥션을 사용하기 전에 유효한지 검사하는 옵션 | - dead connection으로 인한 장애를 막기 위해 유효성 검사를 활성화해야 합니다. |
leak-detection- threshold |
커넥션이 반환되지 않고 일정 시간 이상 점유되었을 때 로그를 남김 | - 커넥션 반환 누락을 조기에 감지해 장애 원인을 추적할 수 있도록 설정해야 합니다. |
결론
Connection Pool은 DB 연결을 매 요청마다 새로 생성하는 비용 높은 방식을 피하고, 제한된 커넥션 수를 효율적으로 관리하여 서버 과부하와 연결 병목을 방지하기 위해 사용됩니다. 연결 생성/해제를 반복하면 응답 속도는 느려지고, 트래픽이 몰릴 때 시스템은 쉽게 불안정해집니다. 커넥션 풀을 통해 커넥션을 미리 확보하고 재사용하면, 성능을 높이고 자원을 보호하며 서비스 안정성을 확보할 수 있기 때문에 선택이 아닌 필수입니다.
'CS' 카테고리의 다른 글
CS 스터디 (DB) 22 - 옵티마이저란 무엇인가요? (0) | 2025.05.23 |
---|---|
CS 스터디 (DB) 20 - 인덱스를 타지 않거나 혹은 기대하는 성능을 못내는 경우는? (0) | 2025.05.23 |
CS 스터디 (DB) 19 - NULL 은 인덱스를 탈까요? (0) | 2025.05.20 |
CS 스터디 (DB) 18 - COUNT(*), COUNT(1), COUNT(column), COUNT(DISTINCT column) 차이에 대해 설명해주세요. (0) | 2025.05.20 |
CS 스터디 (DB) 17 - SQL Injection 과 방어할 수 있는 방법에 대해 설명해주세요. (0) | 2025.05.20 |