오늘은 디비 관련, 커넥션풀에 대해서 포스트 해보겠습니다.
1. 커넥션 풀(Connection Pool)이란?
백엔드 애플리케이션을 개발하다 보면 데이터베이스 연결을 매우 자주 사용하게 됩니다.
이때 매 요청마다 DB 연결을 새로 생성하고 종료하는 방식은 성능에 큰 부담을 줍니다.
이 문제를 해결하기 위한 방법이 커넥션 풀(Connection Pool) 입니다.
1. 커넥션 풀이 필요한 이유
데이터베이스 연결은 생각보다 비용이 큰 작업입니다.
DB 연결 과정은 다음과 같은 단계를 거칩니다.
TCP 연결 생성
인증 및 세션 생성
트랜잭션 준비
이 과정이 매 요청마다 반복되면 다음과 같은 문제가 발생합니다.
응답 속도 저하
DB 서버 부하 증가
연결 수 초과 오류 발생
따라서 연결을 미리 만들어 두고 재사용하는 방식이 필요합니다. 이것이 커넥션 풀입니다.
2. 커넥션 풀의 동작 방식
커넥션 풀은 다음과 같이 동작합니다.
1. 애플리케이션 시작 시 일정 수의 DB 연결을 미리 생성합니다.
2. 요청이 들어오면 풀에서 연결을 하나 가져옵니다.
3. 작업이 끝나면 연결을 종료하지 않고 다시 풀에 반환합니다.
=> 생성 → 사용 → 반환 → 재사용 구조입니다.
이 방식으로 연결 생성 비용을 크게 줄일 수 있습니다.
3. 커넥션 풀을 사용했을 때의 장점
1) 성능 향상
연결을 매번 생성하지 않기 때문에 응답 속도가 빨라집니다.
2) DB 안정성 확보
동시에 생성되는 연결 수를 제한할 수 있어 DB 과부하를 방지할 수 있습니다.
3) 리소스 관리 용이
최대 연결 수를 설정하여 서버 자원을 안정적으로 관리할 수 있습니다.
4. 주요 설정 값
커넥션 풀에는 몇 가지 중요한 설정이 있습니다.
maximumPoolSize
풀에서 사용할 최대 커넥션 수입니다.
동시 요청 처리량과 직접적인 관련이 있습니다.
minimumIdle
유지할 최소 커넥션 수입니다.
connectionTimeout
커넥션을 얻기 위해 기다리는 최대 시간입니다.
이 값들을 적절히 조절해야 성능이 안정적으로 유지됩니다.
Java에서의 커넥션 풀
Java에서는 보통 다음 라이브러리를 많이 사용합니다.
HikariCP (가장 많이 사용됨)
Apache DBCP
아래는 예시입니다.
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
Spring에서는 개발자가 직접 커넥션을 관리하지 않아도 내부적으로 풀을 사용합니다.
Node.js / TypeScript에서의 커넥션 풀
Node.js에서도 커넥션 풀을 사용합니다.
import mysql from "mysql2/promise";
const pool = mysql.createPool({
host: "localhost",
user: "root",
database: "test",
waitForConnections: true,
connectionLimit: 10
});
쿼리를 실행할 때마다 새로운 연결을 만드는 것이 아니라 풀에서 가져와 사용하게 됩니다.
커넥션 풀을 사용할 때 주의할 점
1) 커넥션을 반환하지 않는 문제
커넥션을 반환하지 않으면 풀 고갈 문제가 발생합니다.
Java에서는 보통 트랜잭션 종료 시 자동 반환됩니다.
2) 풀 크기를 너무 크게 설정하는 문제
DB가 감당할 수 있는 연결 수보다 크게 설정하면 오히려 성능이 떨어질 수 있습니다.
커넥션풀은 다음과 같은 환경에서 특히 중요합니다.
트래픽이 많은 서비스
API 서버
마이크로서비스 구조
즉, 대부분의 실무 백엔드 환경에서 필수 개념입니다.
정리하자면 커넥션 풀은
데이터베이스 연결을 미리 만들어 두고 재사용하여 성능과 안정성을 높이는 기술입니다.