지난 글
이전 글 에서 사실 조회수 구현에 대해 쿠키와 동시성을 같이 설명하려고 했으나, 동시성을 설명하는 과정이 길어져, 두 편에 나눠서 쓰게 되었다. (사실 조회수 기능을 구현했던 시간 보다 글로 정리하는 시간이 더 길어진 것 같은..)
여튼 이전 글에서는 조회수를 구현하기 위한 동시성 이슈를 해결하기 위해, F객체의 사용으로 Python 메모리에 로딩 없이 DB직접 반영하는 것과, Transaction 격리 수준 까지 알아보았다.
https://yubi5050.tistory.com/221
이번 글 에서는 '조회 서비스 - 구독 상품 상세 조회' 의 조회수 구현 과정 중 쿠키 활용 부분에 대해 이야기 해보려고 한다.
조회수 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 기능을 구현해보자!
'프로젝트 경험기 > MSA 경험기' 카테고리의 다른 글
[MSA 경험기] 모아 구독 (6) 검색 히스토리 서비스 (by. NoSQL, Singleton) (1) | 2022.11.27 |
---|---|
[MSA 경험기] 모아 구독 (5) Query Profiling을 통한 최적화 (0) | 2022.11.25 |
[MSA 경험기] 모아 구독 (3) 조회수 구현 1 (by. 쿠키와 동시성) (1) | 2022.11.23 |
[MSA 경험기] 모아 구독 (2) 페이지 네이션, 캐싱을 적용한 상품 조회 (2) | 2022.11.23 |
[MSA 경험기] 모아 구독 (1) 프로젝트 기획 및 설계 (0) | 2022.11.21 |