기존 오류 상황)
: 게시글 상세보기 후 추천 버튼 누르면 조회수 +2 되는 상황
#BoardController
● 게시글 상세보기 : 누르면 조회수 증가
@GetMapping(value="/detail/{bnum}")
public String detail(Model model, @PathVariable("bnum") Integer bnum,
AnswerForm answerForm) {
boardService.hit(boardService.getBoard(bnum)); // 조회수 증가
Board board = boardService.getBoard(bnum);
model.addAttribute("board", board)
return "board_detail";
}
● 추천 메서드 : 추천 버튼 누르면 다시 상세보기로 리다이렉트 됨 → 조회수 또 증가
@PreAuthorize("isAuthenticated()")
@GetMapping(value="/vote/{bnum}")
public String boardVote(Principal principal, @PathVariable("bnum") Integer bnum) {
Board board = boardService.getBoard(bnum);
SiteUser siteUser = userService.getUser(principal.getName());
boardService.vote(board, siteUser);
return String.format("redirect:/board/detail/%s", bnum);
}
정리하자면
추천 버튼 클릭(JavaScript를 통해 /board/vote/{bnum}로 이동)
→ BoardController.boardVote() 실행 : 추천 저장 후 게시글 상세페이지로 리다이렉트
→ 다시 BoardController.detail() 실행 → 조회수가 한번 더 올라감
해결하려면?
리다이렉트 시 조회수 증가를 제외하는 조건(fromVote=true)을 추가하거나,
조회수 증가 조건을 강화하여 중복 조회를 필터링하는 방식으로 처리
해결)
: /board/detail/{bnum} 안에서 무조건 조회수 증가시키지 말고, vote 요청인지 아닌지만 판단해서 걸러내기
#BoardController
● 게시글 상세보기
@GetMapping(value="/detail/{bnum}")
public String detail(Model model, @PathVariable("bnum") Integer bnum, AnswerForm answerForm,
@RequestParam(value = "fromVote", required = false) boolean fromVote) {
if(!fromVote) {
boardService.hit(boardService.getBoard(bnum));
}
Board board = boardService.getBoard(bnum);
model.addAttribute("board", board);
return "board_detail";
}
● 추천 메서드
@PreAuthorize("isAuthenticated()")
@GetMapping(value="/vote/{bnum}")
public String boardVote(Principal principal, @PathVariable("bnum") Integer bnum) {
Board board = boardService.getBoard(bnum);
SiteUser siteUser = userService.getUser(principal.getName());
boardService.vote(board, siteUser);
return String.format("redirect:/board/detail/%s?fromVote=true", bnum);
}
쉽게 말해
추천 버튼 클릭 (/board/vote/{추천누른글번호} 이동)
→ boardVote() 메서드 실행 : return String.format("redirect:/board/detail/%s?fromVote=true", bnum);
→ vote 끝나고 /board/detail/ {추천누른글번호} ?fromVote=true로 리다이렉트
if (!fromVote) {
boardService.hit(boardService.getBoard(bnum)); //조회수 증가
}
fromVote=false (기본) → 조회수 증가 , fromVote=true → 조회수 증가 안 함
'Do it > Practice' 카테고리의 다른 글
stmt / pstmt 사용 비교 (1) | 2025.08.18 |
---|---|
JDBC DB연결 예제 (2) | 2025.08.18 |
MySQL) JOIN연습 (0) | 2025.08.13 |
MySQL) SELECT문 연습 (1) | 2025.08.12 |
Java) 예외처리 연습문제 (2) | 2025.08.05 |