🍏 개발일기

커넥션 풀(Connection Pool)

보배 진 2026. 2. 8. 16:47

커넥션 풀(Connection Pool)

DB랑 연결해 둔 통로(커넥션)를 미리 여러 개 만들어두고, 필요한 때 빌려 쓰는 시스템

"DB 연결을 매번 새로 만들지 말고, 미리 만들어 둔 걸 돌려 쓰자"


 

이게 왜 필요할까?

❌ 커넥션 풀이 없으면  

1. 사용자가 요청

2. 서버가 DB에 새 연결 생성

3. 쿼리 실행

4. 연결 종료

 

< 문제 >

DB 연결 생성 = 생각보다 엄청 무거운 작업

요청이 많아지면 : DB 과부하, 서버 느려짐, 심하면 DB 다운

 

 

< 커넥션 풀 구조 >

[요청] → [커넥션 풀] → [DB]
            ↑   ↓
         반납  대여

풀(pool) = 연결 보관소

커넥션 = DB랑 연결된 통로

 

 

 

 

 

내 프로젝트 코드에서 보자

@Autowired
private JdbcTemplate jdbcTemplate;

JdbcTemplate 자체가 커넥션을 만드는 게 아님

DataSource(= 커넥션 풀) 에서 커넥션을 빌려 씀

 

Controller
 → Service
   → Repository
     → JdbcTemplate
       → DataSource(커넥션 풀)
         → DB

실행 흐름 🔼

 

 

Spring Boot 쓰면 99% YES

Spring Boot 기본값: HikariCP (커넥션 풀계의 GOAT 🐐)

spring.datasource.url=...
spring.datasource.username=...
spring.datasource.password=...

이렇게 하면 자동으로 커넥션 풀이 생성된다

 

 

 

 

 

 

커넥션 풀 안에서 실제로 벌어지는 일

요청 1개 들어오면

1. 풀에서 커넥션 하나 대여

2. SQL 실행

3. 커넥션 반납

jdbcTemplate.query(...);
// 내부적으로
// getConnection()
// execute
// close() → 실제 종료 ❌ 풀로 반환 ⭕

close() 해도 진짜 종료 아님

풀에 다시 넣는 것

 

 

풀 크기란?

예시 : spring.datasource.hikari.maximum-pool-size=10

동시에 DB 쿼리 가능한 최대 개수 = 10

요청 10개 바로 처리

요청 11개 대기

 

 

 

 

풀 없으면 실제로 터지는 상황

▪ 쇼핑몰 메인 페이지

▪ 상품 리스트 + 리뷰 + 이벤트 + 찜여부

▪ 사용자 50명 동시 접속

 

풀이 없다면

DB 연결 50개 생성, DB  사망

 

풀이 있다면(10개)

10개 처리, 나머지 대기, 안정적

 

 


 

 

정리

커넥션 풀 = DB 연결 재사용 창고

JdbcTemplate = 빌려 쓰는 사람

HikariCP = 관리자

close() = 반납

풀 크기 = 동시 처리량