DB Connection Pooling이란?
스프링이 워낙 추상화가 잘 되어 있다 보니 스프링을 쓰는 사람들은 DB 그거 그냥 쿼리로 부르면 되는 거 아니야? 라고 생각하겠지만,
아무것도 없는 node나 기타 환경에서 개발해본 사람들은 db connection 관련 설정을 한 번쯤은 해 보았을 것이다.
애플리케이션이 DB에 접근하기 위해서는 우선 DB와의 connection을 열고 (우선 가야할 길을 닦고) DB에 접근해야 한다. (건물에 들어가야 한다)
그런데, 이 길을 닦는 일이 꽤나 비싼 처리여서 (집에서 마트에 가려고 매번 새로 아스팔트를 깔아야 하는 기분이려나)
DB에 접속할 때마다 커넥션을 맺어주는 건 부하가 크게 생길 수 있다.
그래서 connection pooling이라는 개념이 등장했는데,
미리 n개의 커넥션을 맺어두고 pool에 넣어 관리한다.
그리고 DB에 접근해야 할 일이 있을 때마다 새로 connection을 맺는 게 아닌, 이 pool에 커넥션 하나를 빌려줄 것을 요청한다.
당연히, 다 쓰고 나면 DB 커넥션을 끊어버리는 대신, pool에 다시 반환한다.
이렇게 하면 매번 connection을 생성하고 소멸시키는 것보다 훨씬 빠르게, 그리고 적은 리소스로 DB에 접근할 수 있다.
Connection Pool Size
그렇다면, pool에 커넥션을 일단 많이 열어둘수록 병목이 덜 생길 테니 좋은 게 아닐까?
아쉽게도, 아니다.
HikariCP wiki에서는 몇 개의 connection을 열어두면 좋을지에 대한 정확한 공식을 제공하고 있다.
https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
About Pool Sizing
光 HikariCP・A solid, high-performance, JDBC connection pool at last. - brettwooldridge/HikariCP
github.com
pool size = Tn x (Cm - 1) + 1
Tn - 최대 Thread 수
Cm - 하나의 Thread에 동시에 열리는 Connection 수
이 공식은 어떻게 나온 걸까?
리소스 할당 문제에서 데드락을 방지하기 위해 고안된 수학적 접근 방식이다.
쉽게 말해, 모든 스레드가 동시에 최대 커넥션을 요구할 때 시스템이 멈추지 않도록 보장하는 방식이다.
여기서 핵심은 '여유 커넥션'을 하나 더 확보하는 것이다.
각 스레드가 최대로 필요한 커넥션보다 한 개 적은 수를 곱하고, 마지막에 1을 더함으로써 시스템에 최소한의 여유 공간을 만들어낸다.
예를 들어 3개의 스레드가 각각 4개의 커넥션을 필요로 한다면, 이론적으로는 12개의 커넥션이 필요할 것 같다.
하지만 이 공식에 따르면 10개의 커넥션 풀에 1개의 여유 커넥션을 더해 총 11개를 확보하게 된다.
이렇게 함으로써 모든 스레드가 동시에 최대 커넥션을 사용하더라도 시스템이 Deadlock에 빠지지 않도록 설계된 것이다.
'Backend' 카테고리의 다른 글
사람들은 왜 자바가 아닌 코틀린에 열광할까? (0) | 2025.01.05 |
---|---|
Nest.js에서 prisma exception 데코레이터로 깔끔하게 핸들링하기 (0) | 2024.11.24 |
WebFlux에서 chunked 스트리밍 request 받기 (3) | 2024.10.27 |
Next.js 14와 Firebase로 간단하게 백엔드 API 만들기 (1) | 2023.12.22 |
Node.js + TypeScript를 heroku로 배포하기 (0) | 2023.04.08 |