포스트 조회수 중복 카운팅 제거로 데이터 신뢰도 개선
목차
포스트 조회수 중복 카운팅을 막기 위해 조회 로직을 다시 손봤다.
조회수 부풀림, 왜 문제인가
블로그나 콘텐츠 플랫폼에서 조회수는 단순한 숫자가 아니다. 사용자에게는 콘텐츠 인기도를 나타내는 신호가 되고, 운영팀에게는 트렌드 분석의 기초 데이터가 된다. 그런데 같은 사용자가 새로고침할 때마다, 또는 페이지 전환 후 돌아올 때마다 조회수가 증가한다면? 데이터 신뢰도가 떨어지고, 잘못된 의사결정을 초래할 수 있다.
실제로 이 문제는 초반에 눈에 띄지 않다가, 운영팀에서 "어제 조회수가 왜 갑자기 뛸까?"라는 질문이 나올 때쯤이면 이미 누적된 데이터가 오염된 상태가 되어 있다. 그래서 조회 로직은 초기 설계부터 신경 써야 하는 부분이다.
어디서 문제가 발생했나
app/main.py 에서 포스트 조회 엔드포인트를 수정했다. 이전에는 매 요청마다 무조건 view_count 를 증가시켰는데, 이제는 같은 사용자가 일정 시간 내에 같은 포스트를 여러 번 조회할 때 중복을 제거하는 로직을 추가했다.
일반적인 구현 패턴은 몇 가지가 있다:
- 쿠키/로컬스토리지 기반: 클라이언트에서 "이미 봤다"는 플래그를 저장 (조회수 측정 불가능한 클라이언트가 우회 가능)
- 세션 기반: 서버 세션에 사용자-포스트 조합을 임시 저장 (메모리 효율 이슈)
- 데이터베이스 + TTL: 별도 테이블에
user_id,post_id,timestamp를 기록하고, N시간 이내 중복은 스킵 (가장 견고함) - IP + User-Agent 기반: 익명 사용자도 추적 (오류 가능성 높음)
| 방식 | 장점 | 단점 |
|---|---|---|
| 쿠키 기반 | 구현 간단 | 우회 쉬움, 데이터 신뢰도 낮음 |
| 세션 기반 | 서버 제어 | 분산 환경에서 동기화 복잡 |
| DB + TTL | 신뢰도 높음 | 쿼리 오버헤드 추가 |
| IP + UA | 로그인 없는 사용자도 가능 | 정확도 낮음 |
우리 팀은 가입 사용자 기반 플랫폼이므로, 데이터베이스에 최근 조회 기록을 남기고 같은 사용자가 24시간(또는 설정 가능한 TTL) 내에 재방문하면 스킵하는 방식을 택했다.
데이터 정합성을 위한 다른 작업
scripts/bulk_seed.py 도 함께 수정했다. 테스트 데이터를 생성할 때 이전에는 대량의 조회 기록을 무작위로 insert 했는데, 이제는 새로운 중복 제거 로직에 맞춰 조회 기록을 생성하도록 조정했다. 이렇게 하지 않으면:
- 기존 테스트 데이터가 새로운 로직과 충돌할 수 있음
- 개발 환경의 조회수가 실제 로직을 반영하지 못하게 됨
- QA 팀이 테스트할 때 혼란스러운 결과를 마주하게 됨
보통 로직 변경 후 마이그레이션 스크립트를 별도로 준비하는데, 이 경우엔 seed 스크립트를 먼저 정리하는 게 팀 전체의 개발 속도를 높인다.
회고: 측정 가능성과 설계의 중요성
이 작업을 진행하면서 느낀 점은, "조회수 같은 단순해 보이는 지표도 초기 설계가 중요하다"는 것이다. 나중에 "어라, 조회수가 이상한데?" 하고 수정하려면 이미 누적된 데이터 검증, 마이그레이션, 롤백 고려 등 여러 변수가 생긴다.
또한 이런 변경을 할 때는:
- 기존 조회수 데이터를 어떻게 처리할지 (리셋 vs 유지)
- 클라이언트 측에서 TTL 안내를 어떻게 할지 ("24시간 뒤에 조회수 증가 가능")
- 모니터링 대시보드에서 조회수 추이를 어떻게 볼 것인지
이런 것들을 팀과 미리 논의해야 한다. 개발 혼자만 "이렇게 고쳤습니다"라고 하면, 운영팀은 갑자기 조회수 통계 해석이 달라져서 혼란스러워한다.
댓글 0
첫 댓글 달아줘.