문제점
게시글의 조회수를 증가시키는 코드를 작성했다 처음에는 단순히 백엔드쪽에서 게시글에 대한 데이터 요청을 받을 때마다 조회수를 1증가시켰다.
하지만 댓글을 작성하거나 수정하는 경우에도 데이터를 새로 불러오기 때문에 조회수가 증가하고 새로고침으로 조회수를 무한대로 증가시킬 수 있는 문제점들이 있다.
개선방법
오브젝트 배열을 만들고 데이터 요청을 받을 때 현재 로그인 하고있는 사용자의 id를 배열에 넣는다 동시에 setTimeout()
를 이용해서 10분 이후에 사용자의 id를 배열에서 삭제시킨다.
조회수는 사용자의 id가 배열에 없어서 새로 추가할 때만 증가시키고 배열에 존재한다면 증가시키지 않는다.
구현
게시글의 id는 req.params.post_id
, 로그인한 사용자의 id는 req.user.username
로 접근할 수 있게 만들어놓았다. 로그인 기능이 없다면 ip값을 저장하는것도 좋을 것 같다.
오브젝트는 key값으로 게시글의 id, value값으로 사용자의 id배열로 이루어진 배열이다.
예를들어
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//오브젝트 생성
const viewObj = new Object()
//해당 게시글에 대한 id가 오브젝트에 없다면 새로 오브젝트 배열을 생성
if (!viewObj[req.params.post_id]) {
viewObj[req.params.post_id] = []
}
if (viewObj[req.params.post_id].indexOf(req.user.username) == -1) {
//username이 없다면 배열에 추가하고 조회수 증가
viewObj[req.params.post_id].push(req.user.username)
post.view++
//10분이 지나면 배열에서 삭제
setTimeout(() => {
viewObj[req.params.post_id].splice(
viewObj[req.params.post_id].indexOf(req.user.username), 1)
}, 600000)
for (let i in viewObj) {
//공간 절약을 위해 username이 하나도 없으면 해당 오브젝트 삭제
if (i.length == 0) {
delete viewObj.i
}
}
}
전체 코드
https://github.com/Tekiter/EZSET/blob/master/backend/src/api/v1/simple.route.js