CREATE TABLE order_stat_daily (
id BIGINT NOT NULL AUTO_INCREMENT,
stat_date DATE NOT NULL, -- YYYY-MM-DD
order_count INT NOT NULL DEFAULT 0,
order_amount BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uniq_stat_date (stat_date)
);| 1 | 2025-11-21 | 52,345 | 5,000,000,000 |
| 2 | 2025-11-22 | 78,123 | 7,000,030,000 |
| 3 | 2025-11-23 | 90,242 | 8,300,000,000 |
| 4 | 2025-11-24 | 64,243 | 6,000,000,000 |
관리자 페이지에서 전체 주문, 전체 매출, 날짜범위 매출을 매번 카운트 집계하는거 성능이 안좋아
날짜 별로(디폴트 값이 오늘) 주문 통계 테이블을 유지 중임
평상시엔 아무 문제가 없었으나, 어느날 선착순 할인 이벤트에 사람이 몰려
순간적으로 주문이 대량 발생됨
예치금 입금 형태로, 주문 즉시 결제가 된다고 가정
결제 같은 외부 API는 고려하지 않아도 됨
해당 이벤트에서 고객들에게 주문이 너무 느리다고 컴플레인 발생
@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderMapper orderMapper;
@Transactional
public void placeOrder(Long userId, Long amount) {
LocalDate today = LocalDate.now();
// 1. 주문 생성
orderMapper.insertOrder(userId, amount);
// 2. 포인트 차감 / 잔액 차감 등
orderMapper.decreaseBalance(userId, amount);
// 3. 통계 업데이트 (가장 마지막)
orderMapper.updateDailyStat(today, 1, amount);
// @Transactional 덕분에 세 단계 전체가 하나의 트랜잭션
// 하나라도 실패하면 모두 롤백
}
}
1. 위에서 사람이 몰릴 때 병목 구간을 찾으세요
2. 실시간성은 1분까지 허용됨,
즉, 결제 후 맥시멈 1분 후에는 통계에 반영이 되어야함
3. 정합성이 보장이 되어야함
주문 목록 - 통계 정보 간의 불일치는 허용되지 않음
(단, 2번에서 1분 이내는 불일치는 허용)
2,3을 고려하여 개선하세요.
4. (추가) 가능한 더 실시간으로 반영되게 할 방법을 찾으세요