게시판 글을 보려고 상세보기 화면으로 넘어가는데, 해당 사용자가 이글을 봤다는 근거(?) 가 없다면 같은 게시글의 볼 때마다 조회수가 무한으로 증가하게됨.
그래서 나는 기간 1일 짜리 쿠키값을 만들어서 해당 게시물을 들어가면 board+게시글 번호의 쿠키를 만들어서 조회수 중복방지를 해보았음.
Controller
- 쿠키를 만드는 로직 부분
//생성될 쿠키 이름
String cookieName = "board_" + bno;
//생성될 쿠키 값
String cookieValue = "read";
//현재 요청에 의해 쿠키배열에 있는 값을 가져옴
Cookie[] cookies = request.getCookies();
//쿠키가 있는지 없는지 구별하기위해 변수 선언
boolean isRead = false;
/*
만약 해당게시글의 쿠키 값을 가지고 있다면,
반복문을 통해 쿠키 배열에서 값을 찾아내고 비교 확인 후 번복문 종료
*/
if(cookie != null){
for(Cookie cookie : cookies){
if(cookie.getName().equals(cookieName)){
isRead = true;
break;
}
}
}
/*
반대로 이경우는 쿠키가 없기에 cookieName,cookieValue 값을 새로 생성
쿠키 기간을 1일로 지정, 경로는 "/" 으로 하여 모든 페이지에 해당 값을 가지고 다니게 함.
요청값에 쿠키를 추가 시킨 후 , 조회수 1 증가
*/
if(!isRead){
Cookie cookie = new Cookie(cookieName,cookieValue);
cookie.setMaxAge(60*60*24);
cookie.setPath("/");
response.addCookie(cookie);
service.hit(bno);
}
- Controller 전체 코드
@GetMapping("/detail")
public String detail(int bno, Model model, HttpServletRequest request, HttpServletResponse response
,@ModelAttribute("scri")SearchCriteria scri) {
String cookieName = "board_" + bno;
String cookieValue = "read";
Cookie[] cookies = request.getCookies();
boolean isRead = false;
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
isRead = true;
break;
}
}
}
if (!isRead) {
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setMaxAge(60*60*24);
cookie.setPath("/");
response.addCookie(cookie);
service.hit(bno);
}
model.addAttribute("detail",service.detail(bno));
service.updatePin(bno);
return "board/detail";
}
Service & DAO
//Service
//게시글 상세보기
@Override
public BoardVO detail(int bno) {
return dao.detail(bno);
}
//조회수
@Override
public void hit(int bno) {
dao.hit(bno);
}
//DAO
@Override
public BoardVO detail(int bno) {
return session.selectOne("mapper.board.detail",bno);
}
@Override
public void hit(int bno) {
session.update("mapper.board.hit",bno);
}
OracleDB
상세보기
<select id="detail" parameterType="int" resultMap="BoardResult">
<![CDATA[
select category,title,name,regdate,content,hit,pin,startdate,enddate,id
from board
where bno = #{bno}
]]>
</select>
조회수
<update id = "hit">
<![CDATA[
update board
set hit = hit +1
where bno = #{bno}
]]>
</update>
Controller 부분을 제외하고는 간단하게 구현을 하였음

이러면 이젠 게시글을 보게되면 이렇게 게시글 번호에 맞게 쿠키값이 생성되는 것을 확인할 수 있음!
'Spring > Study' 카테고리의 다른 글
| [Spring]부모창 에서 자식창 으로 값 전달하기 (4) | 2023.05.13 |
|---|---|
| [Spring]게시판 공지글기간 설정 (0) | 2023.05.13 |
| [Spring] 게시판 이미지 및 파일 등록 후 상세보기 페이지에서 해당 파일 다운로드 (0) | 2023.04.06 |
| [Spring]비밀번호 인코딩(BCryptPasswordEncoder 적용)-비밀번호 수정 (0) | 2023.03.19 |
| [Spring] 세션 유지 시간 만료 시 경고창 띄우기 (0) | 2023.03.19 |