조회수와 방문자 수를 가볍게 기록하는 D1 테이블 설계
작은 블로그에서 모든 분석 이벤트를 수집할 필요는 없습니다. 운영 화면에 필요한 질문은 보통 단순합니다. 어떤 글이 많이 읽혔는가, 오늘 방문자가 있었는가, 최근 추세가 줄고 있는가. 이 정도를 위해 거대한 이벤트 파이프라인을 만드는 것은 과합니다.
조회수와 방문자는 다른 값이다
글 조회수는 콘텐츠 단위의 카운터입니다. 글 상세 페이지가 열릴 때 posts.view_count를 증가시키면 인기 글 정렬과 화면 표시에는 충분합니다. 반면 방문자 수는 사이트 단위의 중복 제거가 필요합니다. 같은 사용자가 여러 글을 읽어도 방문자는 하나로 볼 수 있습니다.
따라서 테이블도 분리하는 편이 좋습니다. 글별 카운터는 posts에 가깝게 두고, 일자별 방문자는 blogvisitstats 같은 날짜 집계 테이블로 관리합니다. 상세 이벤트를 모두 저장하지 않아도 일자별 그래프는 만들 수 있습니다.
중복 제거는 완벽하지 않아도 된다
쿠키, IP, User-Agent를 조합한 익명 해시는 완벽한 사용자 식별이 아닙니다. 네트워크가 바뀌면 달라질 수 있고, 여러 사용자가 같은 환경을 공유할 수도 있습니다. 하지만 작은 블로그의 운영 지표로는 충분할 때가 많습니다. 중요한 것은 이 숫자를 절대적인 분석값으로 과장하지 않는 것입니다.
차트 요구가 테이블을 결정한다
대시보드에서 최근 1주는 일별, 이번 달은 주별, 이번 년은 월별로 본다면 원천 데이터는 일자 단위면 충분합니다. 집계 단위는 API나 클라이언트에서 바꿀 수 있습니다. 처음부터 월별 테이블을 따로 만들면 범위 선택이 늘어날 때 유연성이 떨어집니다.
가벼운 통계 설계의 핵심은 수집 가능한 모든 것을 저장하지 않는 것입니다. 화면이 실제로 묻는 질문을 기준으로 데이터를 남기고, 나머지는 나중에 필요가 증명될 때 추가하는 편이 운영에 안전합니다.
실제 적용 메모
대시보드에서 한 번 문제가 있었습니다. 방문자 그래프 범위를 바꿀 때 그래프가 죽으면서 옆의 글별 조회수 패널까지 같이 죽었습니다. 원인은 두 패널을 같은 데이터 로딩 흐름에 묶어둔 것이었습니다.
수정 방향은 다음이었습니다.
대시보드 기본 데이터: 요약, 인기 글, 글 목록, 댓글
방문자 그래프 데이터: start/end 날짜로 별도 조회
그래서 /api/admin/dashboard?include_visitors=0으로 기본 패널을 먼저 그리고, 방문자 그래프는 별도 요청으로 가져오게 했습니다. 이제 방문자 차트 렌더링이 실패해도 인기 글 차트와 글 목록은 유지됩니다.
통계 테이블도 같은 기준입니다. 화면에서 필요한 질문이 “일자별 방문자 추이”라면 원천 데이터는 일자 단위로 충분합니다. 주별, 월별, 연도별은 화면에서 집계하면 됩니다.
아직 댓글이 없습니다.