Java/Spring Framework
[ Spring ] Cookie 를 이용한 조회수 증가
Mungwang
2023. 8. 26. 01:11
💎 Spring
- 기존 상세조회 매개변수에 쿠키 사용을위한 HttpServletReauest, HttpServletResponse 추가
// 게시글 상세 조회
@GetMapping("/{boardCode}/{boardNo}")
public String boardDetail( @PathVariable("boardCode") int boardCode
, @PathVariable("boardNo") int boardNo
, Model model
, RedirectAttributes ra
, @SessionAttribute(value ="loginMember", required = false) Member loginMember
, HttpServletRequest req
, HttpServletResponse resp
📺 BoardController
- Cookie.getValue() : 쿠키에 저장된 모든 값을 얻어옴 -> String으로 반환
- String.indexOf("문자열") : 찾는 문자열이 몇번에 존재에 위치하는지 반환 없을시 -1 반환
- 조회수가 오르지 않은 게시글이라면 readBoardNo 이름에 쿠키가 생성
<=> 조회수가 올랐던 게시글이라면 readBoardNo라는 쿠기가 이미 존재하기전에 break;로 구문 종료
// 쿠키를 이용한 조회 수 증가 처리
// 1) 비회원 또는 로그인한 회원의 글이 아닌 경우
if(loginMember ==null || // 비회원
loginMember.getMemberNo() !=board.getBoardNo()) {
// 2) 쿠키 얻어오기
Cookie c = null;
// 요청에 담겨 있는 모든 쿠기 얻어오기
Cookie[] cookies = req.getCookies();
if(cookies !=null) { // 쿠키가 존재할 경우
// 쿠키 중 "readBoardNo"라는 쿠키를 찾아서 c에 대입
for(Cookie cookie :cookies) {
if(cookie.getName().equals("readBoardNo")) {
c = cookie;
break;
}
}
}
// 3) 기존 쿠기가 없거나(c == null)
// 존재는 하나 현재 게시글 번호가
// 쿠키에 저장되지 않은 경우(오늘 해당 게시글 본적 없음)
int result = 0;
if( c ==null) {
// 쿠키가 존재 X -> 하나 새로 생성
c = new Cookie("readBoardNo", "|" + boardNo + "|");
// 조회수 증가 서비스 호출
result = service.updateReadCount(boardNo);
} else {
// 현재 게시글 번호가 쿠키에 있는지 확인
// Cookie.getValue() : 쿠키에 저장된 모든 값을 얻어옴
// -> String으로 반환
// String.indexOf("문자열")
// : 찾는 문자열이 몇번 인덱스에 존재하는지 반환
// 단, 없으면 -1 반환
if(c.getValue().indexOf("|" + boardNo + "|") == -1) {
// 쿠키에 현재 게시글 번호가 없다면
// 기존 값에 게시글 번호 추가해서 다시 세팅
c.setValue(c.getValue() + "|" + boardNo + "|");
// 조회수 증가 서비스 호출
result = service.updateReadCount(boardNo);
}
} // 3) 종료
// 4) 조회 수 증가 성공 시
// 쿠키가 적용되는 경로, 수명(당일 23시 59분 59초) 지정
if(result > 0) {
// 조회된 board 조회 수와 DB 조회 수 동기화
board.setReadCount(board.getReadCount()+1);
// 적용 경로 설정
c.setPath("/"); // "/"이하 경로 요청시 쿠키 서버로 전달
// 수명 지정
Calendar cal = Calendar.getInstance(); // 싱글톤 패턴
cal.add(cal.DATE, 1);
// 날짜 표기법 변경 객체 (DB의 To_CHAR() 와 비슷)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// java.util.Date
Date a = new Date(); // 현재 시간
Date temp = new Date(cal.getTimeInMillis()); // 내일 (24시간 후)
// 2023-08-24 12:17:40
Date b = sdf.parse(sdf.format(temp)); // 내일 0시 0분 0초
// 내일 0시 0분 0초 - 현재시간
long diff = (b.getTime() - a.getTime()) / 1000;
// -> 내일 0시 0분 0초 까지 남은 시간을 초단위로 반환
c.setMaxAge((int)diff); // 수명 설정
resp.addCookie(c); // 응답 객체를 이용해서
// 클라이언트에게 전달
}
}
path ="board/boardDetail";
model.addAttribute("board", board);
}else { // 조회 결과가 없을 경우
path ="redirect:/board/"+ boardCode; // 게시판 첫페이지로 리다이렉트
ra.addFlashAttribute("message","해당 게시글이 존재하지 않습니다.");
}
return path;
}
📺 BoardService
📺 BoardServiceImpl
📺 BoardDAO
📺 board-mapper.xml
💎 결과
- Chrome 브라우저는 쿠키를 볼수없어서 다른 브라우저로 테스트해봐야 쿠키값을 볼수있다
- 메인화면에서는 기본 쿠키만 존재
- 게시판 상세조회에 들어가면 Spring에서 만든 쿠키가 생성된다
- 콘텐츠 : c.setValue(c.getValue() + "|" + boardNo + "|");