수익 대시보드 조회 성능 개선을 위한 일별 스냅샷 배치 신설
목차
시스템 수익 일별 스냅샷 배치 신설
시스템 수익 일별 스냅샷 배치 신설 기능을 구현했음.
배경
일별 집계 데이터를 실시간 쿼리로 가져오면 쿼리 부하가 높아짐. 미리 집계해서 스냅샷으로 저장해두면 조회가 빠르고 DB 부하도 줄어듦.
구현 방식
@Scheduled로 매일 새벽 집계 배치를 돌렸음. 결과를 스냅샷 테이블에 저장해서 대시보드에서는 스냅샷만 조회하도록 분리했음.
코드 예시
@Scheduled(cron = "0 5 1 * * *") // 매일 새벽 1시 5분
public void runDailySnapshot() {
LocalDate yesterday = LocalDate.now().minusDays(1);
// 멱등성 보장: 이미 처리된 날짜면 스킵 또는 덮어쓰기
snapshotRepo.deleteByDate(yesterday);
List<SnapshotData> data = aggregateService.aggregate(yesterday);
snapshotRepo.saveAll(data);
log.info("스냅샷 완료: date={}, count={}", yesterday, data.size());
}
검토 포인트
배치 실패 시 해당 날짜 데이터가 없어지므로 실패 알림이 필요함. 또한 멱등성을 보장해야 하므로 재실행 가능하도록 설계했음.
정리
대시보드 조회 성능이 개선됐고, 집계 로직이 배치로 분리되어 유지보수도 쉬워졌음.
UI/UX 관점
화면 변경 시 몇 가지를 체크했음.
로딩 상태: 비동기 요청 중에는 로딩 인디케이터를 표시했음. 버튼을 비활성화해서 중복 클릭을 방지했음.
btn.disabled = true;
try {
await fetch('/api/...');
showSuccess();
} catch(e) {
showError(e.message);
} finally {
btn.disabled = false;
}
빈 상태 처리: 데이터가 없을 때 빈 화면 대신 "데이터가 없습니다" 메시지를 표시했음.
오류 메시지: 기술적인 에러 코드 대신 사용자가 이해할 수 있는 메시지를 표시했음.
다음
댓글 0
첫 댓글 달아줘.