프로젝트 경험기/MSA 경험기

[MSA 경험기] 모아 구독 (4) 조회수 구현 2 (by. 쿠키와 동시성)

yubi5050 2022. 11. 23. 16:50

지난 글

이전 글 에서 사실 조회수 구현에 대해 쿠키와 동시성을 같이 설명하려고 했으나, 동시성을 설명하는 과정이 길어져, 두 편에 나눠서 쓰게 되었다. (사실 조회수 기능을 구현했던 시간 보다 글로 정리하는 시간이 더 길어진 것 같은..)

 

여튼 이전 글에서는 조회수를 구현하기 위한 동시성 이슈를 해결하기 위해, F객체의 사용으로 Python 메모리에 로딩 없이 DB직접 반영하는 것과, Transaction 격리 수준 까지 알아보았다.

https://yubi5050.tistory.com/221

 

[MSA 경험기] 모아 구독 (3) 조회수 구현 1 (by. 쿠키와 동시성)

지난 글 이전 글 에서는 페이지 네이션, 캐싱을 적용한 상품 리스트 조회를 구현하면서 고민했던 부분에 대해 적어보았었다. https://yubi5050.tistory.com/220 [MSA 경험기] 모아 구독 (2) 페이지 네이션,

yubi5050.tistory.com

이번 글 에서는 '조회 서비스 - 구독 상품 상세 조회' 의 조회수 구현 과정 중 쿠키 활용 부분에 대해 이야기 해보려고 한다.

 

조회수 Counting을 구현시 문제가 되었던 부분은 크게 두 가지 였다.

  • 동시에 여러 유저(n명)가 같은 구독 상품 글에 접근시 조회수가 n만큼 증가하지 않는 문제    
  • 짧은 시간내 반복적으로 동일 유저가 접근시 조회수가 계속 오르는 문제

 

동일 유저의 반복 접근 이슈 - 식별을 어떻게 할 것인가?

예로 특정 유저가 자기 글의 조회수를 높이기 위해, 반복적으로 접근 (새로고침 F5를 마구마구 누른다던가) 하면 조회수를 빠르게 올릴 수 있는데, 이를 방지 하기 위해, 반복적인 같은 접근에 대해 식별을 할 필요가 있다.

 

'모아 구독' 서비스에서 정의한 조회수 기능 전제는 다음과 같다.

  • 최초 유저가 접근시 조회수 상승 o
  • 짧은 시간(1분) 반복적으로 동일한 유저가 접근시 조회수 상승 x
  • 짧은 시간 후에 유저가 재접근하면 조회수 상승 o

 

📌 고민 1) 어떠한 정보로 반복적인 접근을 식별 할 것인지

👉 1. 접근한 유저의 유저 정보 활용

=> '모아구독'은 비사용자도 접근 할 수 있는 성격의 게시판으로, 유저 정보가 없는(비회원들의) 접근도 가능하므로 부적절

 

 

👉 2. IP 기반의 식별

=> 서버에서 접속한 IP를 기록하는 방법으로, IP를 바꿔가면서 까지 번거롭게 조회수를 올리는 일은 조금은 부담스러운 일이기에 괜찮은 방법같지만, 유저가 많아지면 IP를 관리해야 하는 서버의 부담이 커진다고 판단  

 

 

👉 3. Client의 LocalStorage, SessionStorage 이용

=> Local Storage는 클라이언트에게 저장을 보관을 맡기므로 편하나, LocalStorage 값이 영구적으로 저장되므로, 만료 시간에 대한 정보를 local storage에 저장하여, 서버의 로직으로 체크는 가능하겠지만 결론적으로 생성과 만료에 대한 로직 자체가 다 서버에서 해주어야 하므로 단점이 존재.

 

=> Session Storage는 웹 창을 종료할 때마다 값이 초기화 되긴 하지만, 짧은 시간 동안 웹 창을 껏다 켰다 하며, 반복 접근하여 조회수 조작이 가능

 

👉 4. Cookies 활용

=> 방문시 구독 상품에 대한 정보를 cookie로 만료시간을 설정하여 헤더에 넘겨주면, 서버에선 해당 쿠키의 존재 여부만 확인하면 되므로, 기능 목표에 적절하다고 판단 => 최종 쿠키 기반 구현으로 선택

 

 

동일 유저의 반복 접근 이슈 - 핵심 코드

👉 1. 최초 Page 접근시 해당 유저에게 Cookies를 부여! (ex. COOKIE_KEY_NAME4:T)

 

 

👉 2. 재방문시 헤더에 존재하는 Cookies를 파싱해, 현재의 구독 상품 정보가 있으면 조회수 증가 x 

 

 

👉 3. COOKIE, EXPIRED TIME 등의 상수를 지정

 

 

참고 문헌

https://arotein.tistory.com/38 // 조회수 기능을 만드는 방법들

https://velog.io/@rimi0108/Django%EB%A1%9C-%EC%A1%B0%ED%9A%8C%EC%88%98-count-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0 // Django로 조회수 count 기능을 구현해보자!