본문 바로가기
Spring

[Spring DB] Connection Pool

by sangyunpark99 2025. 4. 25.

도입

애플리케이션이 데이터베이스에 쿼리를 보내려면 반드시 DB 연결이 필요합니다.

이 연결은 생각보다 많은 단계와 시간이 소요됩니다.

 

예를 들어, 사용자가 웹에서 버튼 하나만 눌러도, 아래와 같은 절차를 거쳐야 DB에 접근할 수 있습니다.

이미지 출처 : 김영한의 Spring DB v1

  1. 애플리케이션 로직은 DB 드라이버에게 커넥션을 요청합니다.
  2. DB 드라이버는 TCP/IP 네트워크 연결을 시도합니다.
  3. TCP 연결이 완료되면, ID, PW, 부가 정보를 DB에 전달합니다.
  4. DB는 전달받은 정보로 내부 인증 및 세션 생성을 합니다.
  5. 커넥션이 생성이 완료되었음을 애플리케이션에 응답합니다.
  6. 드라이버는 커넥션 객체를 만들어  반환합니다.

이 모든 작업은 매우 비싼 비용을 수반합니다. 특히 네트워크 지연, DB 세션 생성 등의 부하는 실시간 사용자 요청이 몰리는 환경에서 병목이 될 수 있습니다. 즉, 사용자가 애플리케이션을 사용할 때, SQL을 실행하는 시간 뿐만 아니라 커넥션을 새로 만드는 시간이 추가되기 때문에 응답 속도에 영향을 주게 됩니다. 이는 사용자에게 좋지 않은 경험을 줄 수 있습니다.

 

Connection Pool

커넥션 풀은 앞서 나온 커넥션 생성 과정을 매번 반복하지 않기 위한 기술입니다.

 

미리 일정 수의 커넥션을 생성해 풀에 보관을 하고, 애플리케이션이 필요할 때마다 풀에서 꺼내 사용합니다.

다 사용한 커넥션은 다시 커넥션 풀에 반환하고 재사용합니다.

 

이렇게 하면, 매번 TCP 연결, 인증, 세션 생성 등의 부담 없이 빠르고 안정적인 DB 접근이 가능합니다.

(커넥션은 DB 드라이버에서 생성합니다.)

 

 

자세한 흐름은 아래와 같습니다.

 

이미지 출처 : 김영한의 Spring DB v1

 

애플리케이션을 시작하는 시점에 커넥션 풀을 필요한 만큼 커넥션을 미리 확보해서 풀에 보관합니다.

 

이미지 출처 : 김영한의 Spring DB v1

 

커넥션 풀에 들어 있는 커넥션은 TCP/IP로 DB와 커넥션이 연결되어 있는 상태입니다.

 

이미지 출처 : 김영한의 Spring DB v1

 

애플리케이션 로직에서 DB 드라이버를 통해서 새로운 커넥션을 획득하는 것이 아닌, 커넥션 풀에 이미 생성된 커넥션을 객체 참조로 가져다 씁니다. 커넥션 풀에 커넥션을 요청하는 경우, 커넥션 풀은 이미 만들어진 커넥션 중 하나를 반환합니다.

 

이미지 출처 : 김영한의 Spring DB v1

 

애플리케이션 로직에서 커넥션을 다 사용하면, 커넥션을 종료하는 것이 아닌, 다음에 다시 사용할 수 있도록 해당 커넥션을 그대로 커넥션 풀에 반환합니다. 커넥션이 살아있는 상태로 커넥션 풀에 반환됩니다.

 

 

Conneciton Pool 종류

대표적인 Conneciton Pool의 종류 오픈 소스는 commons-dbcp2, tomcat-jdbc pool, HikariCP 등이 있습니다.

최근에는 기본적으로 hikariCP를 사용합니다. 

'Spring' 카테고리의 다른 글

@Transactional 동작원리 (디버깅 편)  (0) 2025.05.22
[Spring Docs] DispatcherServlet #2  (0) 2025.03.16
빈 후처리  (0) 2025.03.13
어드바이저  (0) 2025.03.12
프록시 팩토리  (0) 2025.03.11