로그 행 수와 방문자 수가 다른 이유
처음 만든 방문자 집계는 세션에 오늘 날짜를 기록하고 DailyVisitor.count를 늘리는 방식이었습니다. 현재 공개 통계는 VisitorLog에서 봇을 제외한 뒤 방문 식별자를 중복 제거합니다. 초기 코드의 일별 숫자를 모두 더하는 방식과 현재 화면의 누적 고유 수는 의미가 다릅니다.
이 글은 2026-09-23 저장·집계 코드를 기준으로 설명합니다. 다음 표의 A·B·C는 실제 이용자가 아닌 계산용 방문 식별자입니다.
같은 자료에서 세 가지 숫자 계산하기
| 날짜 | 식별자 | 경로 | 봇 여부 |
|---|---|---|---|
| 9월 21일 | A | / |
아니오 |
| 9월 21일 | A | /example-post/ |
아니오 |
| 9월 21일 | B | / |
아니오 |
| 9월 22일 | A | / |
아니오 |
| 9월 22일 | C | / |
아니오 |
| 9월 22일 | BOT | / |
예 |
저장된 로그는 총 6행입니다. 봇을 제외하면 5행, 날짜별 고유 식별자는 각각 2개이므로 일별 고유 수를 더하면 4입니다. 하지만 이틀 전체에서 중복을 제거한 식별자는 A·B·C의 3개입니다. A가 두 날짜에 모두 방문했기 때문에 4와 3은 동시에 맞을 수 있습니다.
로그 행 수도 모든 페이지 요청 수와 같지 않습니다. 수집 전 필터와 30초 중복 제거를 통과한 기록만 남으므로, 이를 필터 없는 전체 페이지뷰라고 부르면 안 됩니다.
현재 공개 화면이 사용하는 기준
context_processors.py의 blog_stats는 is_bot=False인 로그에 unique_visitor_count를 적용합니다. 오늘과 어제는 해당 visit_date로 좁혀 계산하고, 전체 수는 남아 있는 로그 전체를 대상으로 계산합니다.
식별자가 있는 행은 visitor_id의 서로 다른 값을 세고, 식별자가 빈 과거 행은 (ip_address, user_agent) 조합을 따로 세어 더합니다. 따라서 과거 행과 새 행이 같은 사람이어도 자동 연결하지 않습니다. 쿠키 삭제, 여러 브라우저 사용, 공용 기기는 식별자와 사람 수를 다르게 만듭니다.
DailyVisitor.objects.count()는 날짜별 집계 행의 개수입니다. 방문자 합계가 아닙니다. 현재 코드에는 total_visitor_days라는 별도 값으로 반환되며, 공개 누적 방문자 값은 로그의 고유 수로 계산합니다.
일별 표와 전체 값이 더 달라질 수 있는 경우
현재 별도 함수 unique_visitor_counts_by_date는 식별자가 빈 행을 날짜별 IP만 중복 제거합니다. 반면 전체 고유 수 함수는 IP와 User-Agent를 묶습니다. 같은 날짜에 같은 IP, 다른 User-Agent인 과거 행 두 개가 있으면 이 부분에서 일별 함수는 1, 전체 함수는 2가 될 수 있습니다.
이는 서로 다른 집계 기준이 코드에 남아 있다는 뜻입니다. 실제 사람 수를 알아냈다는 뜻이 아니며, 두 값을 비교할 때 먼저 필터·날짜 범위·과거 행 포함 여부를 맞춰야 합니다. 이번 글의 정리는 집계 기능을 변경하거나 과거 데이터를 보정한 작업은 아닙니다.
초기 구현을 그대로 복사할 때 놓치기 쉬운 점
초기 예제의 daily.count += 1 다음 save()는 읽기와 쓰기가 분리됩니다. 동시에 두 요청이 같은 값을 읽으면 증가분을 잃을 가능성이 있습니다. 현재 보조 일별 카운터에도 이 형태가 남아 있으므로 정밀한 집계 설계에서는 DB의 원자적 증가와 중복 집계 방지를 함께 검토해야 합니다. 단순히 증가식만 바꿔도 모든 중복 문제가 해결되는 것은 아닙니다.
또한 오늘의 기준은 서버 코드가 사용하는 timezone.localdate()입니다. 날짜가 다른 시스템의 보고서를 비교한다면 시간대와 자정 경계를 먼저 맞춥니다. Django의 집계 표현식과 필터 순서는 공식 집계 문서에서 확인할 수 있습니다.
숫자가 달라졌을 때 확인할 순서
- 비교 대상이 로그 행 수, 날짜별 고유 수, 기간 고유 수 중 무엇인지 적습니다.
- 날짜 범위와 봇 제외 조건을 맞춥니다.
- 방문 식별자가 비어 있는 과거 행을 따로 확인합니다.
- 쿠키 변경, 필터 변경, 로그 정리 작업이 있었는지 확인합니다.
- 같은 가상 자료로 함수별 결과를 비교합니다.
오래된 로그를 지우면 현재 남은 로그로 계산하는 누적 고유 수도 달라질 수 있습니다. 따라서 숫자를 고정된 평생 방문자 수로 해석하지 않습니다. 어떤 요청을 저장하지 않는지는 방문 로그 필터 점검에서 이어서 볼 수 있습니다.
댓글 0
로그인 없이 궁금한 점이나 의견을 남겨주세요.
아직 댓글이 없습니다. 첫 의견을 남겨주세요.