쏭의 개발 블로그

DB 커넥션 풀의 용도와 필요 본문

DB

DB 커넥션 풀의 용도와 필요

songu1 2025. 3. 16. 16:12

DB Connection Pool

WAS - DB 연결과 DB 커넥션 풀


DB 커넥풀에 대해 설명하기에 앞서, WAS와 DB연결에 대해 말하자면 다음과 같다.


WAS와 DB는 평상시에 연결되어있는 것이 아니라 Request가 오는 시점에 연결하고 정보를 가져온다. 이때 연결 시 TCP/IP 핸드셰이크와 같은 여러 단계를 거쳐야하므로 상당한 시간이 걸린다.
웹에서 수많은 클라이언트가 동시다발적으로 웹서비스에 접근해 Request들을 날리는 경우 시간 지연 문제가 발생한다. 이를 해결하기 위해 DB Connection Pool을 만들어 DB 연결을 미리 해두는 것이다.
위 그림을 예로 들면, 5개의 연결을 미리 해두고, request가 들어오면 연결된 것들을 통해 정보를 가져온다. 또 다른 request가 들어오면 다른 연결을 사용한다.


DB Connection Pool이란?


DB Connection Pool은 데이터베이스와의 연결을 미리 여러개 생성해 두고, 필요할 때마다 이를 재사용하는 기술이다. 애플리케이션 서버가 시작될 때 일정 수의 데이터베이스 연결을 생성하고, 이를 풀에 저장해두었다가 필요할 때마다 할당하고 반환하는 방식으로 작동한다.
하나의 Pool 형태로 만들어 Tomcat과 같은 미들웨어가 관리해주는 것이다.


DB 커넥션 풀을 사용하는 이유?


그렇다면 DB 커넥션 풀을 사용하는 이유는 무엇일까?
바로 응답성을 높이기 위해 사용하는 것이다.
WAS - DB 연결을 하면 그에 따른 대기 지연이 발생하고 서버의 응답성이 떨어진다. 이를 막기 위해서 DB Connection Pool을 만들어 사전에 연결해놓고 관리해야한다.

DBCP Connection Pool 연결 대기 지연 현상


DB Connection Pool 연결 대기 지연 현상에 대해 알기보기 위해 SK C&C 기술 블로그를 참고했다.

수강신청, 명절 기차 예매 등의 이벤트가 있을 때, 동시에 많은 사용자가 순간적으로 몰리는 현상이 발생한다. 따라서 아무리 여유있는 자원을 가진 시스템이라도 문제가 발생할 가능성이 높아진다.


이 이미지를 보면 사용자가 몰렸을 때 DB커넥션 풀이 모자라 순간적으로 튀는 현상을 볼 수 있다. DB 커넥션 풀이 부족할 경우 응답 시간이 튀는 현상이 발생하여 새 DB 연결을 생성하는 시간이 필요하다. DB 커넥션 풀은 부족하게 만들어두면 안된다.

데이터베이스가 감당가능한 수준을 고려하여 DB 커넥션 풀을 설정해야한다. 감당가능한 수준은 성능테스트, 부하테스트 등으로 알아보면 된다. 예를 들어, DB 서버의 하드웨어적 스펙에서 강제 부하 테스트를 했더니 TPS가 이정도 감당가능한지를 살펴볼 수 있다. 또한 동시다발적인 클라이언트 연결을 100개 정도 생성해서 보내고 과부하를 일으켰을 때, 풀오버가 발생했음에도 불구하고 어느 정도 지연이 생기더니 어떤 결과가 나오더라와 같이 알아보면 된다.
이렇게 하면 발생하지 않은 장애에 대해서도 미리 대응할 수 있다.
요청 대기 시간을 길게하면 너무 오래 기다리게 되어 반응이 늦을 수 있으며, 통신 안하는 채널을 강제로 회수할 경우 문제가 될 수 있다.


커넥션 풀 주요 설정


커넥션 풀의 주요 설정은 다음과 같다.

  • initailSize : 커넥션 풀을 처음 만들 때, DB에 연결할 Connection 수
  • maxActive : 동시에 사용할 수 있는 최대 Connection 수
  • minIdle : 커넥션 풀에 최소한으로 유지할 Connection 수
  • maxIdle : 커넥션 풀에 반납된 Connection 중 최대로 유지될 수 있는 개수

maxIdle을 너무 낮게 설정하면 동시 요청이 많을 때 응답 시간이 길어지며, 높게 설정하면 불필요한 자원을 소모할 수 있다.


커넥션 풀의 최적화 전략


커넥션 풀의 최적화 전략으로는 사용자가 몰릴 것이라고 예상된다면 initialSize와 maxActive, maxIdle, minIdle 항목을 동일한 값으로 설정하는 것을 권장한다고 한다.

그 외 기타 전략으로는 트래픽 패턴 분석, 유효성 검사 활성화, 성능 모니터링, 적합한 라이브러리 선택이 있다.

  • 트래픽 패턴 분석: 실제 트래픽을 분석해 최소 및 최대 연결 수를 적절히 설정하여 피크 타임에 충분한 연결을 제공하고, 비활성 시간에는 자원을 낭비하지 않도록 한다.
  • 유효성 검사 활성화: 유휴 연결 검사와 연결 유효성 검사를 활성화하여 불필요한 연결을 정리하고 항상 유효한 연결만 유지함으로써 안정성을 높인다.
  • 성능 모니터링: 성능 모니터링 도구를 사용해 커넥션 풀 상태를 지속적으로 확인하고, 필요에 따라 설정을 조정하여 애플리케이션 성능을 최적화한다.
  • 적합한 라이브러리 선택: 애플리케이션 요구 사항에 맞는 커넥션 풀 라이브러리를 선택. 예를 들어, HikariCP는 성능과 안정성에서 높은 평가를 받는다.


DB 커넥션 풀이 부족할 때 방법


DB 커넥션 풀이 부족할때는 크게 2가지 방법을 사용할 수 있다.

첫번째 방법은 Pool이 할당될 때까지 기다리는 것이다.
정상적인 경우 기다리면 Pool이 반납되고, 줄을 서서 기다리고 있던 다음 사용자의 요청에 Connection을 주게 되어 DB 처리를 수행하게 된다.
사용자들은 요청이 지연되면 새로고침이나 브라우저를 닫고 새로 열어 새로운 요청을 보내는 경향이 있다. 이럴 경우 DB Pool을 대기하던 이전 요청은 사라지지 않고 시스템에 남아 있게 되고, 새로운 요청이 추가되어 장애로 발생할 수 있다.

두번째 방법은 예외로 처리하는 것이다.
Pool이 부족할 경우 기다리지 않고 바로 예외처리를 하면 된다. 사용자는 입력 후 에러페이지를 볼 수 있지만, 운영자에게는 즉시 DB 커넥션 풀의 설정을 늘려 장애를 사전에 막을 수 있게 된다.


참고자료

https://www.inflearn.com/course/면접-신입-java-백앤드-개발자#curriculum
https://f-lab.kr/insight/understanding-database-connection-pool
https://engineering-skcc.github.io/cloud/tomcat/apache/DB-Pool-For-Event/

'DB' 카테고리의 다른 글

Windows 환경에서 Docker에 Redis 설치  (0) 2025.03.30
Index Scan 인덱스 스캔  (0) 2025.03.23
[DB] 트리거(Trigger) 간단 정리  (0) 2023.02.11
[DB] 저장 프로시저  (0) 2023.02.11
[DB] SQL injection  (0) 2023.02.11