1. 수평 확장 (Scale-Out)
개념
- 서버 인스턴스를 여러 대 두고, 동일한 기능을 가진 애플리케이션을 각각 띄웁니다.
- 로드밸런서가 들어온 요청을 여러 서버에 분산 처리합니다.
구성도
Client ──▶ Load Balancer ──▶ App Server 1
└──▶ App Server 2
└──▶ App Server 3 ...
적용 방법
- 클라우드 환경에서는 Auto Scaling Group을 통해 트래픽에 따라 자동 확장 가능
- 상태 정보를 서버가 들고 있지 않아야 함 → Stateless 구조로 개발 필요
주의사항
- 세션 정보는 Redis 등 외부 저장소에 보관 (Session Clustering)
- 애플리케이션 배포 자동화 필요 (CI/CD)
2. 로드 밸런싱 (Load Balancing)
개념
하나의 서버에 몰리는 요청을 여러 서버로 자동 분산하여 서버 부하를 줄입니다.
방식
- Round Robin: 순차적으로 분산
- Least Connections: 연결 수가 적은 서버에 전달
- IP Hash: 클라이언트 IP 기반으로 고정 서버 연결
툴 예시
- Nginx, HAProxy (소프트웨어 기반)
- AWS ELB (ALB/NLB) (클라우드 서비스)
구현 예 (Nginx)
upstream backend {
server app1.example.com;
server app2.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
주의사항
- HTTPS TLS 종료 위치 결정 (로드밸런서에서 처리할지, 서버에서 처리할지)
- 헬스체크 설정을 통해 죽은 서버로 요청 가지 않도록 설정
3. 캐싱 (Caching)
개념
자주 요청되지만 자주 바뀌지 않는 데이터를 메모리에 저장해두고 빠르게 응답하는 방식
캐싱 위치별 전략
🔸 클라이언트 캐시 (브라우저)
- Cache-Control, ETag, Expires 헤더로 설정
- JS, CSS, 이미지 등 정적 파일에 주로 사용
🔸 서버 캐시
- Redis, Memcached 사용
- 인기 게시글, 상품 목록 등 조회가 많고 변경이 적은 데이터에 적합
- TTL(Time To Live)로 데이터 만료 설정 가능
🔸 DB 캐시
- 특정 SELECT 쿼리 결과를 Redis에 저장해두고, 캐시에서 응답
- 캐시 미스 시 DB 쿼리 수행 후 Redis에 다시 저장
예시 코드 (Spring + Redis)
@Cacheable(value = "products", key = "#id")
public Product findProduct(Long id) {
return productRepository.findById(id).orElseThrow();
}
4. 비동기 처리 + 메시지 큐
개념
요청 처리가 오래 걸리는 작업을 즉시 처리하지 않고, 큐에 넣고 나중에 처리
적용 예시
- 이메일, 알림, 이미지 리사이징, 외부 API 호출 등
동작 흐름
사용자 요청 ─▶ 작업 메시지 생성 ─▶ 메시지 큐 등록
└─▶ Worker가 메시지를 소비하고 작업 수행
툴
- RabbitMQ, Kafka, Redis Streams, AWS SQS
Spring Boot + RabbitMQ 예시
rabbitTemplate.convertAndSend("email.queue", emailMessage);
장점
- 응답 속도 개선
- 트래픽 급증 시에도 백엔드 시스템 안정성 확보
5. DB 최적화
🔸 인덱스 최적화
- 자주 조회하는 컬럼에 인덱스 추가
- 단, 인덱스는 INSERT/UPDATE 성능에 영향을 줄 수 있으므로 주의
🔸 N+1 쿼리 방지
- ORM 사용 시 Lazy Loading으로 인해 발생
- Fetch Join 또는 Batch Fetching으로 해결
@Query("SELECT p FROM Post p JOIN FETCH p.member")
List<Post> findAllWithMember();
🔸 샤딩 (Sharding)
- 데이터를 수평 분할하여 여러 DB에 분산
- user_id, region, time 등 기준으로 분할
🔸 레플리케이션 (Replication)
- Master → Write
- Slave → Read
- 읽기 요청 분산 가능
6. CDN (Content Delivery Network)
개념
정적 파일을 전 세계 여러 서버에 미리 복제해두고, 사용자에게 가장 가까운 서버에서 응답
적용 대상
서비스
- Cloudflare, AWS CloudFront, Azure CDN 등
장점
- 정적 트래픽을 웹 서버에서 분리
- 응답 속도 향상 (Latency 개선)
- DDoS 대응 효과도 있음
7. Rate Limiting & Throttling
개념
사용자의 요청 횟수를 제한하여 서비스 보호 (비정상적인 과도한 요청 차단)
구현 방법
- IP 기준 요청 횟수 제한
- API 키 기준 제한
- Sliding Window 또는 Token Bucket 알고리즘 사용
툴 예시
- Nginx + Lua
- Spring Interceptor + Redis
- AWS API Gateway Rate Limiting
Spring 예시
if (redis.incr(ip + ":request") > LIMIT) {
throw new RateLimitExceededException();
}
8. 서킷 브레이커 & 백오프 전략
🔸 서킷 브레이커
- 외부 시스템 실패 감지 시 자동으로 호출 차단
- Open → Half-Open → Closed 상태 변화
라이브러리
- Resilience4j, Hystrix (Deprecated)
🔸 백오프 전략
- 실패 시 점진적 재시도 (exponential backoff)
9. 배치 처리
개념
실시간이 아닌 작업은 주기적으로 모아서 한 번에 처리
적용 예
툴
- Spring Batch, Crontab, Airflow