Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

KSI일기장

0502spring 게시판(3) 글 조회수 증가, 중복제거 본문

Spring

0502spring 게시판(3) 글 조회수 증가, 중복제거

MyDiaryYo 2023. 5. 2. 21:10

게시글 조회 시 조회수 증가 및 중복 증가 제거

 

VO BoardDetail

package edu.kh.comm.board.model.vo;

import java.util.List;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class BoardDetail {
	private int boardNo;
	private String boardTitle;
	private String boardContent;
	private String createDate;
	private String updateDate;
	private int readCount;
	private String memberNickname;
	private String profileImage;
	private int memberNo;
	private String boardName;

	private List<BoardImage> imageList;

	private int boardCode;

}

 

BoardController

//게시판 상세 조회
	@GetMapping("/detail/{boardCode}/{boardNo}")
	public String boardDetail(@PathVariable("boardCode") int boardCode,
							@PathVariable("boardNo") int boardNo,
							@RequestParam(value="cp", required = false, defaultValue = "1") int cp,
							@ModelAttribute("BoardDetail") BoardDetail boardDetail,
							Model model, HttpSession session,
							HttpServletRequest req, HttpServletResponse resp) {
		
		//게시글 상세조회 서비스 호출
		BoardDetail detail = service.selectBoardDetail(boardNo);
		
		
		//쿠키를 이용한 조회수 중복 증가 방지 코드
		//->같은 사람이 조회수 반복 증가 X  +  본인글 조회수 증가 X
		
		//@ModelAttribute 별도 required속성이 없어서 무조건 필수
		//->세션에 loginMember가 없으면 예외 발생
		//해결방법: HttpSession 사용
		
		//상제조회 성공시(BoardDetail detail != null)
		//->같은 사람이 조회수 반복 증가 X  +  본인글 조회수 증가 X
		
		
		if(detail != null) {	//상세조회 성공시
			Member loginMember = (Member) session.getAttribute("loginMember");
			//					Member로 다운캐스팅
			
			int memberNo = 0;
			
			if(loginMember != null) {	//로그인 했을 시
				memberNo = loginMember.getMemberNo();
			}
			
			//글쓴이와 현재클라이언트(로그인한 사람)가 같지 않은 경우
			if(detail.getMemberNo() != memberNo) {
				//기존 존재하던 쿠키 저장하는 변수
				Cookie cookie = null;
				
				//쿠키 얻어오기
				Cookie[] cArr = req.getCookies();
				
				//얻어온 쿠키가 null아니고 길이가 0보다 크면 (쿠키가 있을경우)
				if(cArr != null && cArr.length > 0) {
					
					//얻어온 쿠키 중 이름이 "readBoardNo"가 있으면 얻어오기
					for(Cookie c : cArr) {
						if(c.getName().equals("readBoardNo")) {
							cookie = c;
						}
					}
				}
				
				
				int result = 0;
				
				if(cookie == null) {	//기존 "readBoardNo" 이름의 쿠키가 없던 경우
					cookie = new Cookie("readBoardNo", boardNo + "");
					//"" 문자열로 바꾸기
					
					result = service.updateReadCount(boardNo);
				}else {	//기존 "readBoardNo" 이름의 쿠키가 있던 경우
				
					//->쿠키에 저장된 값 뒤쪽에 현재 조회된 게시글 번호를 추가
					//단, 기존 쿠키값에 중복되는 번호가 없어야한다
					
					
					String[] temp = cookie.getValue().split("/");
					// -> ex) "readBoardNo" : "1/11/10/20" -> [1,11,10,20]
					
					List<String> list = Arrays.asList(temp); //배열 -> List로 변환
					
					//List.indexOf(Object)
					//-> List에서 Object와 일치하는 부분의 인덱스를 반환
					//-> 일치하는 부분이 없으면 -1 반환
					
					if( list.indexOf(boardNo + "") == -1  ) {
						
						cookie.setValue(cookie.getValue() + "/" + boardNo);
						result = service.updateReadCount(boardNo);	//조회수 증가 서비스 호출
						
					}
					
				}
				
				
				//결과값 이용한 DB동기화
				if(result > 0) {
					detail.setReadCount(detail.getReadCount() + 1); 
					//이미 조회된 DB데이터 동기화
					
					cookie.setPath(req.getContextPath());
					cookie.setMaxAge(60*60*1);
					resp.addCookie(cookie);
				
				}
				
			}
			
		}
		
		
		model.addAttribute("detail", detail);
		
		return "board/boardDetail";
		
	}

BoardServiceImpl

//게시글 조회수 증가
	@Override
	public int updateReadCount(int boardNo) {

		return dao.updateReadCount(boardNo);
	}

BoardService

/**조회수 증가 
	 * @param boardNo
	 * @return
	 */
	int updateReadCount(int boardNo);

BoardDAO

/**조회수 증가 DAO
	 * @param boardNo
	 * @return
	 */
	public int updateReadCount(int boardNo) {

		return sqlSession.update("boardMapper.updateReadCount", boardNo);
	}

board-mapper.xml

<!-- 게시판 조회수 증가 -->
  <update id="updateReadCount">
  	UPDATE BOARD SET READ_COUNT = READ_COUNT + 1
  	WHERE BOARD_NO = #{boardNO}
  </update>

 

결과

-->