개인 프로젝트라도 대규모 트래픽을 대비한 구조로 설계해두면 훗날 큰 도움이 된다. 이 글은 서버 개발자의 관점에서 DB 커넥션 풀과 Redis 캐싱을 어떻게 이해해야 하는지 정리한 내용이다.
1. DB 커넥션 풀은 왜 필요한가?
DB 연결을 새로 여는 작업은 생각보다 매우 무겁다.
- 네트워크 연결
- 인증
- 소켓 오픈
요청마다 커넥션을 새로 열고 닫으면:
- 응답 속도가 느려지고
- 동시 요청이 많아질수록 DB가 먼저 죽는다
1-1. 커넥션 풀의 역할
Connection Pool
- 서버 시작 시 미리 여러 개의 DB 연결을 만들어 둔다.
- API 요청이 들어오면 → 커넥션 1개를 빌려간다.
- DB 작업 후 → 커넥션을 닫지 않고 풀에 반환한다.
스프링 부트는 기본적으로 HikariCP를 사용한다.
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
max-lifetime: 1800000
정리: 커넥션 풀은 실서비스에서 “필수”에 가깝다.
2. 동시 요청 = 필요한 커넥션 수
2-1. 요청 1개는 커넥션 1개를 사용한다
- MyBatis / JPA / JDBC 관계 없음
- 쿼리가 실행되는 순간 커넥션 1개가 필요
- 트랜잭션 안에서 여러 쿼리를 실행해도 커넥션은 1개만 유지
예를 들어:
- 100명이 동시에 “게시글 리스트 조회” API 요청
- → 100개의 스레드 → 100개의 커넥션 필요
2-2. 커넥션 풀이 부족하면?
maximum-pool-size=10인 상태에서 100명 동시 조회:
- 10명 처리
- 90명 대기
- 대기 시간이 timeout 넘으면 500 에러 발생
핵심: 중요한 건 “사용자 수”가 아니라 “동시 요청 수”다.
3. 느린 쿼리는 커넥션을 오래 점유한다
예를 들어 어떤 SELECT 쿼리가 7~8초 걸린다면?
- 그 7~8초 동안 커넥션 1개가 계속 점유된다.
- 이런 쿼리가 여러 개라면 → 풀 전체 커넥션이 묶여 버린다.
- 새 요청들이 커넥션을 얻지 못해 타임아웃 발생
즉, 느린 쿼리 몇 개만 있어도 전체 API가 멈출 수 있다.
4. API 서버만 늘리면 되는 게 아니다
많은 초심자들이 “서버를 늘리면 해결되겠지?”라고 생각하지만 실제로는 DB가 먼저 병목에 도달한다.
- API 서버는 Auto Scaling으로 쉽게 늘릴 수 있음
- 하지만 DB는 모든 요청이 몰리기 때문에 확장이 어렵고 비쌈
- 심지어 API 서버를 늘릴수록 DB 부하는 더 증가함
예:
- API 서버 5대 × 풀 크기 20 = 최대 100개 DB 연결
- MySQL 기본 max_connections = 151
- → 조금만 늘어도 DB가 먼저 터진다
5. 그래서 Redis가 필요하다
5-1. Redis는 “DB를 보호하는 캐시 계층”
Redis = 메모리 기반 캐싱 서버
- 조회가 많고 자주 변하지 않는 데이터를 캐싱
- DB보다 10~100배 빠른 접근 속도
- 메모리 기반이어서 디스크 IO 병목이 없음
Redis로 캐싱하면 DB에 가지 않아도 되는 데이터의 예:
- 사용자 프로필
- 게시글 목록
- 일정 리스트
- 공지사항
- 설정값
5-2. Redis도 부하는 있지만 매우 강하다
- 초당 수만~수십만 요청 처리 가능
- cpu spike는 TTL 몰림, 큰 데이터 저장 시 발생 가능
- 그래도 DB에 비하면 훨씬 가벼움
Redis의 역할: DB가 감당해야 할 읽기 트래픽을 대규모로 줄여주는 “방패”.
6. 개인 프로젝트라도 Redis를 넣는 게 이득인 이유
트래픽이 많지 않아도 개인 프로젝트에 Redis를 도입하면:
- 확장성을 고려한 서버 설계 경험이 생기고
- 캐싱·TTL·무효화·분산락 같은 실무 기술을 익힐 수 있고
- 이력서에 강력한 문장으로 녹여낼 수 있다
예시로 구현 가능한 것:
- 게시글 리스트 캐싱
- 댓글 개수 캐싱
- 사용자 기본 정보 캐싱
- 데이터 수정 시 캐시 무효화
- HikariCP 풀 튜닝
7. 전체 요약
- DB 커넥션 풀은 DB 커넥션을 재사용하여 성능과 안정성을 확보한다.
- 요청 1개는 커넥션 1개를 사용하며, 동시 요청이 많아지면 풀이 쉽게 소진된다.
- 느린 쿼리는 커넥션을 오래 잡아 전체 API를 마비시킬 수 있다.
- API 서버만 늘려서는 해결되지 않는다. DB는 쉽게 병목된다.
- Redis는 조회 트래픽을 DB 대신 처리하는 캐시 계층이다.
- 개인 프로젝트라도 Redis 적용은 큰 실무 경험을 제공하며 이력서에도 강하게 어필된다.
“API를 만드는 개발자”에서 나아가, 확장성과 트래픽을 고려한 서버 엔지니어로 성장하기 위해 반드시 알아야 하는 내용이라 생각한다.
'개발' 카테고리의 다른 글
| Spring Boot(Kotlin) — 2편. API Response 포맷 설계 (0) | 2025.11.24 |
|---|---|
| Spring Boot(Kotlin) 서버 기본 셋팅 — 1편. 왜 멀티 모듈 구조인가? (0) | 2025.11.21 |
| 웹서버, WAS, 톰캣, JEUS의 관계 완전 정리 (0) | 2025.11.03 |
| 💡화이트리스트 기반 파일 업로드 구현 (0) | 2025.10.31 |
| 왜 브라우저는 HTTPS가 되는데 Java 서버는 실패할까? (0) | 2025.09.16 |