게시판 글을 보려고 상세보기 화면으로 넘어가는데, 해당 사용자가 이글을 봤다는 근거(?) 가 없다면  같은 게시글의 볼 때마다 조회수가 무한으로 증가하게됨.

그래서 나는 기간 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 부분을 제외하고는 간단하게 구현을 하였음

결과화면

이러면 이젠 게시글을 보게되면 이렇게 게시글 번호에 맞게 쿠키값이 생성되는 것을 확인할 수 있음!

복사했습니다!