- 기존에 만들었던 게시판 구조에서 게시글 작성일과 조회수를 간단하게 추가하여 구현해보았습니다.
📝 1. 게시글 작성일 추가
- 작성일은 Board 엔티티에 함수를 따로 추가하여 View에서 해당 함수 호출하는 식으로 손쉽게 구현할 수 있었습니다.
@CreationTimestamp
private Timestamp create_date;
public String getCreateDate() {
return new SimpleDateFormat("yyyy.MM.dd").format(create_date);
}
<span style="float:right">Created: ${board.createDate}</span><br>
📝 2. 조회수 추가
- 조회수의 경우에도 구글링을 통해 쉽게 구현할 수 있었는데 그 방법은 다음과 같습니다.
- 우선 Repository에 아래와 같은 함수를 생성해주었습니다.
package com.cos.blog.repository;
// @Repository
public interface BoardRepository extends JpaRepository<Board, Long>{
@Modifying
@Query("update Board b set b.count = b.count + 1 where b.id = :id")
void updateCount(Long id);
}
- 다음으로 Service에서 해당 함수를 이용해 조회수를 증가시키며, View에서는 간단히 ${board.count} 명령어를 통해 이를 출력해볼 수 있습니다.
@Transactional
public Board detail(Long id) {
boardRepository.updateCount(id);
return boardRepository.findById(id).orElseThrow(() -> {
return new IllegalArgumentException("글 상세보기 실패: 아이디를 찾을 수 없습니다.");
});
}
- 다만 이렇게 할 경우 같은 사용자가 반복해서 게시글을 들락날락 할 경우에도 조회수가 계속 늘어나게 됩니다.
- 이 부분을 방지하기 위해 쿠키(Cookie)를 사용하였으며 그 방법은 아래와 같습니다.
@Transactional
public Board detail(Long id, HttpServletRequest request, HttpServletResponse response) {
Cookie oldCookie = null;
Cookie[] cookies = request.getCookies();
if (cookies != null)
for (Cookie cookie : cookies)
if (cookie.getName().equals("boardView"))
oldCookie = cookie;
if (oldCookie != null) {
if (!oldCookie.getValue().contains("[" + id.toString() + "]")) {
boardRepository.updateCount(id);
oldCookie.setValue(oldCookie.getValue() + "_[" + id + "]");
oldCookie.setPath("/");
oldCookie.setMaxAge(60 * 60 * 24);
response.addCookie(oldCookie);
}
}
else {
boardRepository.updateCount(id);
Cookie newCookie = new Cookie("boardView","[" + id + "]");
newCookie.setPath("/");
newCookie.setMaxAge(60 * 60 * 24);
response.addCookie(newCookie);
}
return boardRepository.findById(id).orElseThrow(() -> {
return new IllegalArgumentException("글 상세보기 실패: 아이디를 찾을 수 없습니다.");
});
}
- 간단하게 로직을 설명하자면 다음과 같습니다.
- HttpServletRequest로부터 클라이언트 쿠키를 가져와 boardView라는 이름의 쿠키가 존재하는지 살펴보고 만약 존재한다면 oldCookie라는 이름으로 가져온다.
- oldCookie가 null이 아니라면 즉, boardView라는 이름의 쿠키가 이미 존재한다면 해당 쿠키의 value가 현재 접근한 게시글의 id를 포함하고 있는지 검사한다.
- 만약 포함하고 있다면 조회수를 증가시키지 않으며, 포함하고 있지 않다면 조회수를 증가시키고 게시글 id를 oldCookie에 추가한 뒤 HttpServletResponse로 전달한다.
- oldCookie가 null이라면 즉, boardView라는 이름의 쿠키가 존재하지 않는다면 마찬가지로 해당 게시글의 조회수를 증가시키고 해당 게시글 id로 boardView라는 이름의 새로운 쿠키를 생성한 뒤 HttpServletResponse로 전달한다.
- 여기서 id를 괄호로 감싼 이유는 해당 게시글을 이미 조회한 적이 있는지를 판단하기 위해서 contains를 사용하게 되는데, 단순히 숫자만 사용한다면 101, 10, 1 등은 모두 중복된 조회로 여겨 조회수가 증가하지 않을 것입니다.
- 따라서 괄호를 포함하므로써 온전히 해당 게시글의 id만 검사하도록 한 것입니다.
💡 알게 된 점
- 쿠키를 사용하여 클라이언트 측에 사용자 정보를 남기는 방법
📌 Reference
'🚗 Backend Toy Project > 스프링 부트 게시판' 카테고리의 다른 글
[스프링부트 게시판] 29. 추천 기능 구현 (1) | 2022.09.01 |
---|---|
[스프링부트 게시판] 28. 게시글 검색 기능 구현 (0) | 2022.08.30 |
[스프링부트 게시판] 26. 커스텀 Validation을 통한 중복 검사 구현 (0) | 2022.07.02 |
[스프링부트 게시판] 25. 회원가입시 validation 체크 (0) | 2022.06.30 |
[스프링부트 게시판] 24. Remember Me 기능 구현 (0) | 2022.06.29 |