개발 slecs

대시보드 일별 정산 데이터를 자정에 최종 확정하도록 개선

목차

어제 데이터를 자정에 확정하는 작업을 했다. 겨우 한 줄처럼 들리는 커밋이지만, 그 안에는 daily 통계 시스템에서 자주 마주치는 시간대 처리의 까다로움이 담겨 있다.

Daily 카드, 자정마다 뭔가 일어나야 한다

Dashboard의 "daily" 카드는 매일 자정(00:00)에 리셋되는 24시간 단위 통계를 보여준다. 오늘 집계된 데이터와 어제 집계된 데이터를 구분하고, 자정이 넘으면 어제 데이터는 더 이상 변하지 않아야 한다는 뜻이다.

이게 생각보다 복잡하다. 왜냐하면:

  • 어제 데이터는 자정 직후에도 "아직 정산 중일 수 있다" (비동기 작업, 재시도, 지연된 이벤트 처리)
  • 사용자가 대시보드를 켰을 때 어제 데이터가 계속 변한다면 "불안정하게" 느껴진다
  • 정산/감시 시스템에서는 "어제 데이터의 최종값"을 신뢰할 수 있어야 한다

그래서 명시적으로 "자정이 지났을 때 어제 데이터를 24h 최종 마감한다"는 단계가 필요하다.

전일 카드의 최종 마감 처리

이번 변경의 핵심은 간단하다:

변경 전 변경 후
어제 데이터 계속 업데이트 자정 지난 후 어제 데이터를 읽기 전용으로 확정
daily 값이 자주 변함 daily 값이 안정적
"최신값이 뭔지" 불분명 "최종값은 이것"이 명확

여기서 "EDIT"는 단순 수정이 아니라, 기존의 느슨한 처리를 좀 더 명확하게 다시 정의했다는 의미로 본다. 예를 들어:

# 개선 전: 그냥 어제 날짜의 데이터를 쿼리
yesterday_stats = get_stats(date=yesterday)

# 개선 후: 자정이 지났으면 명시적으로 "최종 마감됨" 플래그 확인
if is_past_midnight():
    yesterday_stats = get_stats(date=yesterday, finalized=True)

이렇게 하면 나중에 다른 팀원이나 의존 시스템에서 "이 데이터는 더 이상 변하지 않는다"는 걸 보장받을 수 있다.

자정 처리의 미묘한 트레이드오프

이 류의 작업을 하면서 배운 점들:

  • 타이밍의 문제: 자정이 정확히 00:00:00일 때 처리하는가, 아니면 첫 요청 시점에 처리하는가?
  • 여러 타임존: 서버 시간대와 사용자 시간대가 다르면? (UTC vs 로컬)
  • 데이터 일관성: 마감 처리 도중 쿼리가 들어오면? (트랜잭션 처리 필요)
  • 감시 비용: "어제 데이터가 정말 마감됐는지" 확인하는 로직까지 필요할 수도

내가 한 작업은 이 모든 고민 위에 선 것이다. 팀에서는:
- 대시보드를 보는 사용자는 "안정적인 어제 수치"를 본다
- 정산/감시 시스템은 "확정된 최종값"을 신뢰할 수 있다
- 나중에 데이터 감사할 때 "언제 확정됐는지" 알 수 있다

다음 고민

이 패턴은 daily, weekly, monthly 등 시간 단위 통계에서 계속 반복된다. 한 번 잘 정의해두면:

  • 자정마다 자동으로 실행되는 작업 (cron 또는 이벤트 기반)
  • 마감 상태를 DB에 기록하기
  • 대시보드는 마감된 데이터와 진행 중인 데이터를 다르게 표현

같은 로직을 재사용할 수 있다. 이번 작업이 그 기반이 됐다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.