Developer Knowledge
개발자가 알아야 할 지식: 커넥션 풀, 연결을 아끼지 않으면 빠른 서비스도 멈춘다
DB와 외부 서비스 커넥션 풀의 크기, 대기열, 타임아웃을 설계하는 법을 정리합니다.
커넥션 풀는 코드가 커지고 사용자가 늘어날수록 조용히 중요해지는 실무 개념입니다. 처음에는 세부 구현처럼 보이지만, 실제로는 시스템이 실패를 어떻게 다룰지 정하는 기준이 됩니다.
왜 개발자가 알아야 하나
커넥션 풀는 작은 코드 조각보다 시스템의 약속에 더 가깝습니다.
이 기준이 없으면 구현은 동작해도 운영 순간에 비용, 장애, 데이터 불일치가 드러납니다.
개발자가 이 개념을 알면 설계 결정의 이유를 더 분명히 설명하고, 장애가 나기 전에 위험을 줄일 수 있습니다.
핵심 개념
첫 번째 핵심은 경계입니다. 커넥션 풀가 적용되는 범위와 적용되지 않는 범위를 구분해야 합니다. 경계가 흐리면 예외 처리가 곳곳에 흩어지고, 나중에는 같은 문제가 서로 다른 방식으로 해결됩니다.
두 번째 핵심은 계약입니다. 서버, 클라이언트, 데이터베이스, 운영 도구가 어떤 값을 믿고 어떤 실패를 허용하는지 문서와 코드에 함께 드러나야 합니다.
세 번째 핵심은 관측 가능성입니다. 제대로 설계했는지 알려면 성공 경로뿐 아니라 거절, 충돌, 지연, 재시도 같은 사건도 로그와 지표로 확인할 수 있어야 합니다.
작은 예시 또는 체크리스트
웹 서버 인스턴스 20대가 각각 DB 커넥션 풀 50개를 열면 최대 1000개 연결이 됩니다. DB가 감당할 수 있는 연결 수보다 크면 요청이 늘어난 순간 처리량이 늘기보다 context switching과 대기만 늘어납니다.
- 전체 인스턴스 수를 곱한 최대 커넥션 수가 DB 한도 안에 있는가?
- 풀 대기 시간과 획득 실패를 지표로 보고 있는가?
- 느린 쿼리가 커넥션을 오래 붙잡고 있지 않은가?
- 외부 API 클라이언트도 연결과 동시성 한도를 갖고 있는가?
- 풀 크기 조정이 부하 테스트로 검증되었는가?
실무에서 자주 생기는 오해
-
“풀을 크게 하면 더 빠르다”는 오해가 있습니다. 병렬성이 늘어도 DB가 처리할 수 있는 일의 양은 제한되어 있습니다.
-
“커넥션 에러는 DB 문제”라고만 보면 애플리케이션의 대기열과 timeout 설정을 놓칩니다.
-
“기본값이면 충분하다”는 생각도 위험합니다. 인스턴스 수와 트래픽 패턴에 따라 기본값은 과하거나 부족할 수 있습니다.
오늘 바로 적용해보기
서비스 전체 최대 DB 커넥션 수를 계산하세요.
커넥션 획득 대기 시간을 대시보드에 추가하세요.
느린 쿼리와 풀 고갈이 같은 시간에 발생하는지 비교하세요.
더 알아보기
- HikariCP Wiki: About pool sizing
- PostgreSQL Docs: Managing kernel resources
- Microsoft Learn: Connection pooling
오늘의 takeaway
커넥션 풀은 많이 열수록 좋은 수도꼭지가 아니라, 병목을 통제하기 위한 제한 장치입니다.