728x90
반응형
[Spring Boot] 게시판 조회수 중복 방지 (Cookie 사용, Mybatis)
게시판에서 조회수는 사용자가 해당 게시글을 읽어보게 하는 하나의 지표가 될 수 있다고 생각한다.
그러한 기능을 단지 게시글에 접속하는것만으로 무한정 올릴 수 있다면, 그 지표의 역할이 사라진다고 본다.
그렇기에 내가 만드는 게시판에는 조회수 중복을 방지하도록 하였다.
구현
먼저 간단하게 Cookie의 개념을 집고 넘어가는 것이 좋다.
Cookie란 HTTP 통신 과정에서 브라우저에 저장되는 작은 데이터 조각이라 할 수 있다.
[Network] 간단히 알아보는 Cookie, Session
Cookie에 대해서는 위의 글에 간단히 정리해 두었다.
BoardMapper.xml
<update id="boardViewCount">
UPDATE hellparty_board
SET viewCount = viewCount + 1
WHERE boardIdx = #{boardIdx}
</update>
BoardController
@GetMapping(value = "/detail")
public String detailGET(@RequestParam(name = "boardIdx") int boardIdx,
@SessionAttribute(name = "loginUser", required = false)UserDTO loginUser,
HttpServletRequest request,
HttpServletResponse response,
Model model) {
log.info("Controller detailGET");
BoardDTO boardDTO = boardService.boardDetail(boardIdx);
model.addAttribute("loginUser", loginUser);
model.addAttribute("boardDTO", boardDTO);
/* 조회수 로직 */
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
log.info("cookie.getName " + cookie.getName());
log.info("cookie.getValue " + cookie.getValue());
if (!cookie.getValue().contains(request.getParameter("boardIdx"))) {
cookie.setValue(cookie.getValue() + "_" + request.getParameter("boardIdx"));
cookie.setMaxAge(60 * 60 * 2); /* 쿠키 시간 */
response.addCookie(cookie);
boardService.boardViewCount(boardIdx);
}
}
} else {
Cookie newCookie = new Cookie("visit_cookie", request.getParameter("boardIdx"));
newCookie.setMaxAge(60 * 60 * 2);
response.addCookie(newCookie);
boardService.boardViewCount(boardIdx);
}
return "/board/detail";
위의 로직을 보면
1. reqeust를 통해 쿠키를 가져온다.
1-1. 만약 쿠키가 존재하지 않다면 새로운 visit_cookie라는 이름의 쿠키를 생성하고 추가해준 후 조회수를 증가시킨다.
2. 가져온 쿠키의 value에 해당 boardIdx값이 존재 하지 않다면 추가시켜준 후, 조회수를 증가시켜 준다.
개발자 도구를 통해 확인해 보면 visit_cookie 라는 이름의 쿠키에 value는 boardIdx 값인 1이 들어가 있는것을 볼 수 있다.
쿠키 값이 이상하게 꼬여서 안된 경우가 생겼지만, 그 경우 문제되는 쿠키를 삭제하고 새로고침만 해줘도 해결되었고, 그 뒤 그런 경우는 생기지 않았다.
참고 블로그
https://mighty96.github.io/til/view/
https://ondolroom.tistory.com/446
728x90
반응형
'1.프로그래밍 > Java' 카테고리의 다른 글
[Java] Singleton Pattern 이란? (디자인 패턴) (0) | 2022.07.28 |
---|---|
[Java] BufferReader, BufferWriter 사용하기(System.out.print 와 Scanner 가 느린 이유) (0) | 2022.07.05 |
[Spring Boot] @JsonFormat으로 Date 타입 직렬화(Json Date 타입 포맷) (0) | 2022.06.23 |
[Spring Boot] TimeZone 설정 (KST, UTC, KST to UTC, 9시간 차이) (0) | 2022.06.09 |
[Spring Boot] Quill.js + 이미지 업로드 (위지윅 에디터 이미지 업로드) (1) | 2022.06.07 |