문제 상황
리뷰 좋아요 기능에서 DB 부하를 줄이기 위해
Redis에 좋아요 값을 누적한 뒤,
스케줄러를 통해 일정 주기로 DB에 반영하는 write-back 구조를 적용하였다.
이 과정에서
Redis에 누적된 데이터를 일정 시간 후 한 번에 DB에 반영하는 구조를 보고
이 방식 자체가 벌트 처리(Bulk Processing)라고 착각하였다.
즉,
여러 데이터를 모아서 한 번에 처리한다 = 벌크 처리
라고 이해하고 있었다.
헷갈렸던 이유
Redis에 데이터가 누적된 후
스케줄러가 실행되면
그동안 쌓인 데이터가 DB에 반영된다.
이 흐름만 보면
- 여러 데이터가 한 번에 처리되는 것처럼 보였고
- 따라서 벌크 처리라고 오해하게 되었다.
하지만 실제 코드를 확인해보니
DB 반영은 다음과 같이 개별 처리 방식으로 이루어지고 있었다.
for (Map.Entry<Object, Object> entry : entries.entrySet()) {
Review review = reviewRepository.findById(reviewId);
review.applyLikeDelta(delta);
}
즉,
- 데이터는 Redis에 모여 있었지만
- DB에는 여전히 하나씩 조회 + 하나씩 업데이트가 수행되고 있었다.
개념 정리
1️⃣ 스케줄러 (write-back 구조)
Redis에 데이터를 누적한 뒤
일정 주기로 DB에 반영하는 방식이다.
- DB 호출을 줄이기 위해 지연 반영
- 트래픽이 많은 환경에서 성능 개선에 효과적
⭐ 언제 DB에 반영할 것인가 (타이밍 전략)
2️⃣ 벌크 처리 (Bulk Insert / Update)
여러 데이터를 하나의 쿼리로 한 번에 처리하는 방식이다.
- DB와의 통신 횟수를 줄여 성능을 개선
- 대량 데이터 처리에 유리
⭐ DB를 어떻게 효율적으로 처리할 것인가 (처리 방식)
비유로 이해하기
기존 잘못된 이해
- 음식 여러 개를 모아서
- 한 번에 배달하면 벌크라고 생각
실제 개념
현재 코드
- 음식 10개를 모음
- 하지만 10번 나눠서 배달
⭐ DB 호출 10번 발생
벌크 처리
- 음식 10개를 모아서
- 한 번에 배달
⭐ DB 호출 1번
핵심 깨달음
데이터를 모아서 처리하는 것과
DB를 한 번에 처리하는 것은 전혀 다른 개념이었다.
- Redis에 데이터를 모으는 → write-back 전략
- DB를 한 번에 처리하는 것 → 벌크 처리
즉,
현재 구조는
- 스케줄러를 통해 지연 반영은 하고 있지만
- DB 처리 방식은 여전히 개별 업데이트 방식이었다.
개선 방향
더 효율적인 구조를 위해서는
다음과 같은 방식으로 개선할 수 있다.
Redis 누적 → 스케줄러 실행 → 벌크 업데이트 → DB 반영
즉,
- 스케줄러로 타이밍을 제어하고
- 벌크 처리로 DB 호출을 최소화하는 구조
정리
- 스케줄러 → DB 반영 시점을 제어하는 전략
- 벌크 처리 → DB 호출을 줄이기 위한 처리 방식
두 개념은 서로 다른 역할을 가지며,
함께 사용하는 것이 가장 효율적인 구조이다.
'트러블슈팅' 카테고리의 다른 글
| Response DTO에서 Builder와 생성자를 구분해서 사용한 이유 (1) | 2026.03.30 |
|---|---|
| Redis write-back 구조에서 벌크 업데이트 적용하기 (0) | 2026.03.20 |
| Redis write-back 구조에서 데이터 유실 문제 (0) | 2026.03.19 |
| 리뷰 개수 조회 성능 개선 및 동시성 문제 해결 (0) | 2026.03.19 |
| Redis write-back 구조에서 스케줄러 주기와 벌크 처리 고민 (0) | 2026.03.18 |