기술과 산업/언어 및 프레임워크

Spring Boot 시리즈 19편 – 대규모 트래픽 대응 전략: Connection Pool, Cache, Scale-out 실전 가이드

B컷개발자 2025. 4. 28. 21:00
728x90

Spring Boot로 대규모 트래픽에 대응하는 전략을 정리했습니다. Connection Pool 최적화, Cache 설계, 서버 확장(Scale-out) 구조까지 실전 중심으로 설명합니다.


Spring Boot 시리즈 19편 – 대규모 트래픽 대응 전략: Connection Pool, Cache, Scale-out 실전 가이드

개발한 서비스가 성공적으로 성장하면 결국 트래픽 폭증 문제를 만납니다.
평소에는 잘 동작하던 애플리케이션이 수십 배 이상의 요청을 받으면

  • 데이터베이스 연결 부족
  • API 지연
  • 서버 과부하
  • 장애 발생
    같은 문제가 터질 수 있습니다.

이번 글에서는 Spring Boot 환경에서 대규모 트래픽에 견디는 아키텍처 설계 방법을 실전 기준으로 정리합니다.


📌 1. 대규모 트래픽 시 주요 병목 구간

병목 구간 주요 원인

DB 연결 Connection Pool 고갈, 대기 큐 폭증
CPU 부하 과도한 동기 처리, IO Blocking
네트워크 대량 응답 데이터, 비효율적 API 설계
세션 관리 Stateful 세션 → 서버 확장성 저하

✅ 2. Connection Pool 최적화 전략

1️⃣ HikariCP 설정 (Spring Boot 기본)

Spring Boot는 기본으로 HikariCP를 사용합니다.
하지만 대규모 트래픽 대응을 위해 Connection 수 조정이 필요합니다.

spring:
  datasource:
    hikari:
      maximum-pool-size: 50
      minimum-idle: 10
      idle-timeout: 30000
      connection-timeout: 3000
      max-lifetime: 1800000
  • maximum-pool-size: 동시에 허용할 최대 DB 연결 수
  • connection-timeout: 연결을 기다리는 최대 시간 (밀리초)
  • DB 서버가 감당 가능한 Connection 수를 초과하면 오히려 장애 위험

2️⃣ 실무 튜닝 기준

항목 추천 값

대규모 서비스 CPU 코어 수 × 2 ~ 3
커넥션 풀 모니터링 HikariMetrics + Prometheus 연동
Fail Fast 설정 연결 실패 시 빠르게 오류 발생 (fail-fast=true)

🔥 3. Cache 전략 강화

트래픽 대응에서 가장 강력한 무기는 **읽기 최적화(Cache)**입니다.

1️⃣ 조회 성능 개선

  • 자주 호출되는 데이터 (ex. 메인 페이지, 상품 목록)은 Redis 등으로 캐싱
  • TTL(Time To Live) 설정으로 최신성 관리
@Cacheable(value = "products", key = "#categoryId")
public List<Product> getProducts(Long categoryId) {
    return productRepository.findByCategoryId(categoryId);
}
  • 1차 캐시: Caffeine (Heap Memory)
  • 2차 캐시: Redis (분산 메모리)

2️⃣ 캐시 패턴 적용

패턴 설명

Cache Aside 요청 시 캐시 조회, 없으면 DB 조회 후 캐시 저장 (가장 일반적)
Read-Through DB 대신 Cache Provider가 직접 조회
Write-Through DB 저장과 동시에 캐시 업데이트
Write-Behind 캐시만 먼저 업데이트, 이후 DB 비동기 저장

🏗️ 4. Scale-out 서버 확장 구조 설계

1️⃣ Stateless 서버 구성

  • 세션 정보를 서버 메모리에 저장하면 확장이 불가능
  • JWT 토큰 기반 인증으로 Stateless 유지
  • 세션이 필요할 경우 Redis 세션 클러스터 사용

2️⃣ 로드 밸런서 구성

  • Nginx, AWS ELB 등을 사용해 트래픽 분산
  • 서버 장애 발생 시 헬스 체크 기반으로 자동 장애 조치

3️⃣ Auto Scaling 적용

  • AWS EC2 Auto Scaling, Kubernetes HPA 등 사용
  • CPU 사용률, 메모리, 요청 수 기준으로 서버 수 자동 조정
# Kubernetes HPA 예시
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 3
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60

🧠 실무 대응 전략 요약

항목 전략

DB 병목 해결 HikariCP 커넥션 풀 튜닝 + 쿼리 최적화
읽기 부하 감소 Caffeine + Redis 캐시 2단계 적용
서버 확장성 확보 Stateless 서버 + 로드밸런싱
장애 복구 준비 Auto Scaling + 헬스 체크 기반 운영
운영 모니터링 Prometheus, Grafana 대시보드 필수

✅ 마무리 요약

항목 요약

Connection 관리 HikariCP 풀 크기 및 타임아웃 조정
Cache 강화 Read 집중 로직 Redis 캐싱
Scale-out 구조 Stateless + Auto Scaling 기반 확장성 확보
장애 대비 로드밸런서 헬스 체크, 자동 복구 체계 구축
모니터링 실시간 지표 수집 및 이상 징후 탐지

📌 다음 편 예고

Spring Boot 시리즈 20편: 메시지 큐 기반 비동기 아키텍처 – Kafka, RabbitMQ로 확장성 강화

 

728x90