DB Connection Pool

jin·2026년 2월 20일

✅ DB Connection Pool이란?

애플리케이션과 데이터베이스 사이의 연결을 미리 여러 개 생성해 두고, 필요할 때마다
빌려준 뒤 다 쓰면 다시 반납받는 연결관리소.

✅ 왜 사용해야 할까?

데이터베이스와 새로운 연결을 맺고 끊는 과정은 컴퓨터 입장에서 비용이 매우 크고 시간이 오래 걸리는 무거운 작업이다.
만약 사용자가 웹사이트에 접속할 때마다 DB와 매번 새로운 연결을 맺어야 한다면 응답속도가 크게 떨어지고, DB 서버에도 엄청난 부하가 발생한다. 커넥션 풀을 사용하면 미리 만들어둔 연결을 재사용하기 때문에 애플리케이션의 성능과 처리 속도가 획기적으로 향상된다.

✅ 락과 커넥션 반납 지연의 관계

스프링부트에서 @Transactional 등을 통해 트랜잭션이 시작되면, 애플리케이션은 커넥션 풀에서 커넥션을 하나 빌려온다. 중요한 점은 트랜잭션이 완전히 종료(Commit 또는 Rollback) 될 때까지 이 커넥션을 절대 풀에 반납하지 않는다.
만약 트랜잭션 내부에서 특정 데이터에 락을 잡고 오랫동안 놓아주지 않는다면, 자연스럽게 해당 커넥션도 오랜 시간 어플리케이션에 묶여 있게 된다.

✅ 반납이 늦어지면 발생하는 현상

  1. 커넥션 고갈(Connection Starvation): 락 대기 등으로 지연되는 트랜잭션들이 쌓이면, 풀(Pool)에 있는 모든 커넥션이 사용중이 된다
  2. 대기열 발생(Thread Block): 새로운 요청을 보낸 사용자들은 풀에 남은 커넥션이 없으므로, 누군가 커넥션을 반납할 때 까지 대기한다. 애플리케이션의 스레드들이 커넥션을 기다니며 멈춰버린다.
  3. 타임아웃 및 장애: 설정된 대기시간이 지나도 커넥션을 얻지 못하면 애플리케이션은 예외를 던진다.

✅ 실무에서의 예방책

  • 트랜잭션 범위 최소화: 핵심로직에만 좁게 트랜잭션을 건다
  • 트랜잭션 내부에서 외부 I/O 작업 절대 금지: 트랜잭션 안에서 외부API를 호출하거나 무거운 파일 처리를 하는 건 금물이다. 만약 외부 API 응답이 5초 지연되면 귀한 DB 커넥션 1개도 아무 일을 안하면서 낭비된다.
  • 쿼리 튜닝 및 인덱스 최적화: 락을 잡는 시간 자체를 최소화하기 위해 데이터베이스가 데이터를 빠르게 찾고 락을 빨리 풀 수 있도록 인덱스를 적절하게 타도록 설계해야 한다.
profile
성장중

0개의 댓글