게시글을 조회했을 때, 조회수가 증가하는데, 문제는 새로고침해도 조회수가 계속 증가한다는 피드백이 있었다.
이를 보완하기 위해 찾아보다가 방법을 찾았고, 적용도 성공해서 적어본다.
| Post.java
...
@Column(columnDefinition = "integer default 0", nullable = false)
private int hits;
...
| PostService.java
@Transactional
public ResponseEntity<PostReadResponseDto> readPost(Long postId, MemberDetails memberDetails) {
...
// 조회 수 증가
updateHits(postId);
...
}
// 조회수 증가 로직
@Transactional
public int updateHits(Long id) {
return postRepository.updateHits(id);
}
| PostRepository.java
public interface PostRepository extends JpaRepository<Post, Long> {
...
@Modifying
@Query("update Post p set p.hits = p.hits + 1 where p.id = :id")
int updateHits(Long id);
}
게시글 상세 페이지에 접근하면, 조회 수가 증가되기 때문에, readPost()메소드에 조회 수 중복을 방지하는 로직을 추가했다.
| PostService.java
@Transactional
public ResponseEntity<PostReadResponseDto> readPost(Long postId, MemberDetails memberDetails, HttpServletRequest request, HttpServletResponse response) {
...
// 조회 수 중복 방지
Cookie oldCookie = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("postView")) {
oldCookie = cookie;
}
}
}
if (oldCookie != null) {
if (!oldCookie.getValue().contains("["+ postId.toString() +"]")) {
updateHits(postId);
oldCookie.setValue(oldCookie.getValue() + "_[" + postId + "]");
oldCookie.setPath("/");
oldCookie.setMaxAge(60 * 60 * 24);
response.addCookie(oldCookie);
}
} else {
updateHits(postId);
Cookie newCookie = new Cookie("postView", "[" + postId + "]");
newCookie.setPath("/");
newCookie.setMaxAge(60 * 60 * 24);
response.addCookie(newCookie);
System.out.println(newCookie);
}
...
}
// 조회수 증가 로직
@Transactional
public int updateHits(Long id) {
return postRepository.updateHits(id);
}
| post-details.js
// 게시글 상세 읽기
function getPost() {
...
$.ajax({
type: 'GET',
url: process.env.BACKEND_HOST + '/post/' + params['id'],
xhrFields: {
withCredentials: true
},
...
});
}
서버는 8080, 클라이언트는 5000번을 쓰기 때문에 서로 출처가 다르다. 이렇게 되면 쿠키를 통해 통신을 할 수 없는데(클라이언트에서 서버로 요청 시, 자동으로 쿠키가 요청 메시지에 담기지 않음), 이를 해결하기 위해 withCredentials = true
로 해주어야 한다.
xhrFields: { withCredentials: true },
를 추가했다.게시글에 접근하면, 조회 수가 증가하고, 접근한 게시글 번호가 쿠키에 담긴다.
접근한 게시글에 재접근해도 이전과는 다르게 조회 수가 증가하지 않게 된다.
https://dev-coco.tistory.com/113#--%--%EC%A-%--%EC%-A%A-
https://mighty96.github.io/til/view/
https://kosaf04pyh.tistory.com/152
안녕하세요 2년이 지난 지금 포스팅을 보고 댓글을 남깁니다 ㅎㅎ..
1번 포스팅을 보고, 2번 포스팅을 보면 1번 포스팅의 재 조회 시간은 다시 (60 60 24) 이 시간으로 초기화 되는걸 까요??