KSI일기장
0502spring 게시판(3) 글 조회수 증가, 중복제거 본문
게시글 조회 시 조회수 증가 및 중복 증가 제거
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>
결과
-->
'Spring' 카테고리의 다른 글
0428spring 마이페이지(3) 회원탈퇴 (1) | 2023.05.03 |
---|---|
0428spring 마이페이지(2) 비밀번호변경(암호화) (0) | 2023.05.03 |
jstl scope 4가지 종류 (0) | 2023.05.02 |
0502spring 게시판(2) 글 상세조회 (0) | 2023.05.02 |
0501spring 게시판(1) 글 조회 (pagination(페이지번호) 포함) (0) | 2023.05.01 |