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 + "|");