Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[문제] 조회수는 어떻게 구현해야 할까? #6

Open
Sangyong-Jeon opened this issue Aug 19, 2022 · 0 comments
Open

[문제] 조회수는 어떻게 구현해야 할까? #6

Sangyong-Jeon opened this issue Aug 19, 2022 · 0 comments

Comments

@Sangyong-Jeon
Copy link
Owner

Sangyong-Jeon commented Aug 19, 2022

[문제발생]게시글 수정페이지에서는 상세조회 페이지로 들어가게되는데 이 때 조회수 증가문제 처리하기

조회수는 무엇일까?

  • 게시글을 한명의 사용자가 여러번 접속해도 전부 카운트해야할까?
  • 게시글당 한 명의 사용자는 한 번만 카운트를 해야할까?
  • 게시글당 하루에 1번만 카운트를 해야할까?
  • 비회원의 경우에도 조회수를 증가시켜야 할까?
  • 만약 IP 기반인 경우, 한명의 사용자가 여러 장소에서 접속했을 때 조회수 증가는 어떻게 할까?
  • 쿠키 기반인 경우, 고의로 삭제했을 때는 어떻게 해야할까?

위와 같이 조회수 중복 방지를 생각하다가 깊은 고민에 빠졌다.
조회수가 높을수록 가치있는 정보(게시글)이라는 의미가 될 수도 있기 때문에 커뮤니티 서비스가 있는 곳이라면 깊게 생각해볼만한 주제이다.
특히 유튜브 같은 곳은 조회수가 수익으로 연결되므로 매우 중요한 부분이다.
유튜브는 다음과 같이 조회수 규칙을 정한것 같다.

  • 사용자가 의도적으로 동영상을 시작한다
  • 사용자는 적어도 30초 동안 영상을 시청해야한다
  • 최대 반복수는 300번으로 예상된다
  • 최대 반복수를 넘었을 시 봇을 이용하는지 유효성 검사 단계 수행되면서 더 이상 조회수가 증가하지 않는다
  • 조회수 증가하지 않는 상황
    • 많은 장치에 대해 하나의 IP 주소를 사용하여 동시에 동일한 영상을 시청할 때
    • 동시에 영상을 보고 윈도우 또는 탭을 많이 가질때
    • 영상을 시청하는 30초마다 페이지 새로고침

내가 만드는 게시판에서의 조회수는 다음과 같다.

  • 하루에 1번 조회수 증가
  • 비회원도 조회수 증가

이렇게 기준을 잡으니 어떤 기술을 제외하고 어떤 기술을 고민해야하는지 정리가 되었다.


저렇게 생각한 이유가 현재 게시글에는 추천수가 없으므로 가치있는 정보를 판단하기에는 조회수 밖에 없었다.
따라서 한 사람이 며칠에 걸쳐서 그 게시글을 본다면 가치있는 정보라고 판단했다.
또한 게시글당 한번만 카운트가 된다면 중복해서 본 것은 제외가 되기 때문에 추천수가 없는 지금은 이렇게 해야할 것 같았다.

하루만에 20번 접속했을 때 전부 카운트를 한다면,
실수로 새로고침을 했다던지, 고의로 조회수를 높이는 어뷰징이라든지 이런 상황이 발생할것 같기도 하다.
(수익 모델이라든지 조회순 검색이 없어서 괜찮을지도...)


조회수 구현 방법

  1. 게시글 전체 조회 페이지에서 클릭했을 때 조회수 증가하기
  2. 세션 또는 쿠키를 이용
  3. IP 이용
  4. DB 이용

1. 게시글 전체 조회 페이지에서 클릭했을 때 조회수 증가하기

  • 새로고침 시 조회수 중복 방지 O
  • 클릭했을 때만 조회수 증가 O
  • URL로 직접 들어가면 조회수 증가 X
  • 비회원 조회수 증가 O

사용자가 클릭했을때마다 조회수가 증가 되며, URL은 조회수로 취급하지 않는다.
따라서 이 방법은 제외한다.


2. 세션 또는 쿠키를 이용

  • 새로고침 시 조회수 중복 방지
  • 페이지 접속했을 때 조회수 증가 O
    • (하루기준)
  • 비회원 조회수 증가 O
  • 고의 삭제의 문제점

이 방법은 페이지를 접속했을 때를 기준으로 한다.
하지만 단점으로는 HTTP 요청마다 쿠키를 보내야하므로 쿠키값이 커질경우 네트워크 트래픽에 부담을 준다.
유선 네트워크는 괜찮지만 3G 모바일 네트워크에서는 다음 그림과 같이 좋지 않은 영향을 미치게 된다.

image

또한 RFC 2109 쿠키 표준안에 따라

  • 300개까지 생성 가능
  • 최대 크기 4,096 바이트
  • 하나의 호스트나 도메인에 최대 20개까지 생성 가능

대부분의 브라우저는 위 표준안보다 적은 개수의 쿠키를 지원하고 있다.

char(2바이트)를 3개씩 써서 게시글을 표현한다면 약 682개 게시글을 쿠키에 담을 수 있다.
일반적인 사람이라면 상관없을 것 같다.


3. IP 또는 Mac Address이용

  • 새로고침 시 조회수 방지 O
  • 페이지 접속했을 때 조회수 증가 O
    • 게시글당 하나의 IP는 조회수 1만 증가 (하루기준)
  • 저장 장소의 문제점
    • DB 비용은 비쌈
    • 인메모리 데이터 저장소 사용
  • 접속 장소의 문제점

IP는 장소에 따라 유동적으로 변할 수 있는 문제점이 있다. 하지만 근처 여러 기기로 비회원이든 회원이든 접속해도 동일 유저로 식별된다.
Mac 주소는 어느 장소에서도 식별이 가능하다. 하지만 디바이스를 변경하면 다른 유저로 식별이 된다.

이 둘은 길이도 길기때문에 많은 유저와 많은 게시글과 함께 저장하기엔 저장 장소의 문제점이 있다.
DB는 비싸므로 인메모리 데이터 저장소인 Redis를 고려할만한 것 같다.


4. DB 이용

  • 새로고침 시 조회수 방지 O
  • 페이지 접속했을 때 조회수 증가 O
  • 비회원은 어떻게 식별할 것인지에 대한 문제점

DB는 평생동안 게시글을 읽었는지 안읽었는지 표시할 때 괜찮은 것 같다.
하루마다 저장하고 삭제하는 것이 DB에 부담과 비용이 클 것 같다.
또한 비회원은 어떻게 식별할 것인지에 대한 문제점이 있다.
비회원 같은 경우 IP나 기기번호로 식별할 수밖에 없을 것 같다


결론

  • 하루에 1번 조회수 증가
  • 비회원도 조회수 증가

위 규칙을 따라서 조회수 증가를 할 것이기 때문에 고려할만한 사항은 2번 쿠키 또는 3번 IP 또는 MAC 주소이다.

따라서 2번 쿠키로 먼저 조회수 증가를 구현한다.
그 후 다른 프로젝트나 현재 프로젝트가 어느정도 끝나고 리팩토링을 할 때 3번으로 해봐야겠다.

참고
네이버 테크 블로그

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant