Search
Duplicate
📁

⭐ 커넥션 풀(Connection pool ) 사이즈를 관리하는 이유

커넥션 풀의 개념

Connection Pool(커넥션 풀)은 데이터베이스와의 연결(Connection)을 재사용할 수 있도록 관리하는 기술이다.
데이터베이스 작업을 수행할 때마다 매번 새로운 커넥션을 생성하고 해제하는 것은 시간과 자원을 많이 소모한다.
커넥션 풀을 사용하면 미리 정해진 수의 커넥션을 풀에 보관하고, 필요할 때마다 재사용하여 이러한 오버헤드를 줄일 수 있다.

커넥션 풀의 작동 원리

1.
초기화
애플리케이션이 시작될 때, 커넥션 풀은 설정된 초기 크기만큼 데이터베이스 커넥션을 생성하고 풀에 저장한다.
2.
재사용
애플리케이션이 데이터베이스 작업을 요청하면, 커넥션 풀에서 사용 가능한 커넥션을 할당한다.
작업이 끝나면 커넥션은 풀로 반환된다.
3.
최대 크기 관리
동시에 많은 요청이 발생해 사용 가능한 커넥션이 없을 경우, 풀은 새로운 커넥션을 생성할 수 있지만, 설정된 최대 크기를 초과할 수 없다.
4.
후에 커넥션 관리
일정 시간 동안 사용되지 않은 커넥션은 풀에서 제거될 수 있다.

커넥션 풀 사이즈를 관리하는 이유

커넥션 풀 사이즈 관리의 중요성

커넥션 풀 사이즈를 적절하게 관리하는 것은 애플리케이션 성능과 자원 활용에 중대한 영향을 미친다.
작게 설정
풀 사이즈가 너무 작으면, 동시에 발생하는 많은 요청을 처리하기 위한 충분한 커넥션이 부족해져 데이터베이스 작업의 대기 시간이 증가하고, 애플리케이션의 응답성이 저하된다.
크게 설정
풀 사이즈가 너무 크면, 사용되지 않는 커넥션으로 인해 메모리와 자원이 낭비된다.
데이터베이스 서버에 과도한 부하를 주어 전체 시스템의 성능을 저하시킬 수 있다.
적정 사이즈 설정
애플리케이션의 요구 사항과 트래픽 패턴을 분석하여 커넥션 풀의 최적 사이즈를 결정하는 것이 중요하다.
애플리케이션의 성능을 최적화하고 자원을 효율적으로 사용하는 데 필수적이다.

커넥션 풀 재사용의 필요성

JDBC(Java Database Connectivity) 위에서 동작하는 커넥션은 서버와 데이터베이스(DB) 사이의 연결을 맺는다. JDBC에서 처음 연결을 맺을 때 핸드셰이크 과정을 거친다.
핸드셰이크 과정은 TCP 연결을 설정하는 단계로, 클라이언트와 서버가 서로를 인증하고 통신 채널을 설정하는데 필요한 절차이다.
매번 커넥션을 새로 맺으면 이 핸드셰이크 과정을 반복해야 하므로 시간이 더 많이 소요된다.
따라서 항상 커넥션을 미리 맺어두면 핸드셰이크 시간을 단축할 수 있다.

커넥션 풀 재사용의 이점

1.
성능 향상
데이터베이스 커넥션을 매번 새로 생성하고 해제하는 것은 시간과 시스템 자원을 많이 소모한다.
커넥션 풀을 사용하면 미리 생성된 커넥션을 재사용함으로써 오버헤드를 줄이고 애플리케이션의 전반적인 응답 시간을 개선할 수 있다.
2.
자원 사용 최적화
미리 정해진 수의 커넥션을 풀에서 관리함으로써 시스템 자원을 효율적으로 사용할 수 있다.
사용하지 않는 커넥션을 무한정 생성하지 않기 때문에 메모리 사용량을 최적화할 수 있다.
3.
스케일링 용이성
애플리케이션의 사용량이 증가할 때 커넥션 풀 사이즈를 조정함으로써 쉽게 스케일링할 수 있다.
트래픽 변동에 유연하게 대응할 수 있게 해준다.

커넥션 풀 개수 유지의 중요성

1.
애플리케이션 안정성 보장
커넥션 풀의 개수를 적절하게 유지하면, 피크 타임에도 데이터베이스 요청을 안정적으로 처리할 수 있다.
사용자 요청이 폭증해도 충분한 커넥션을 제공할 수 있어 서비스 중단이나 성능 저하를 방지할 수 있다.
2.
자원 낭비 방지
커넥션 풀의 개수가 너무 많으면 사용되지 않는 커넥션으로 인해 시스템 자원이 낭비된다.
적절한 수준에서 커넥션 풀의 크기를 관리함으로써 메모리와 CPU 자원을 효율적으로 사용할 수 있다.
3.
데이터베이스 부하 관리
데이터베이스에 동시에 접속할 수 있는 커넥션 수에는 한계가 있다.
커넥션 풀의 개수를 적절히 관리함으로써 데이터베이스 서버에 과도한 부하가 가해지는 것을 방지할 수 있다.
데이터베이스 서버의 안정성과 성능 유지에 기여한다.
적절한 커넥션 풀 사이즈 관리는 데이터베이스 연결 오버헤드를 줄이고, 애플리케이션의 성능을 향상시키며, 자원 사용을 최적화하는 핵심 요소이다. 사용자에게 더 빠르고 안정적인 서비스를 제공할 수 있다.

참고

이미지 출처는 해당 강의의 김영한 강사님 참고자료입니다.