토이 프로젝트/게시판 프로젝트
12. 게시판 프로젝트 - 페이징, 조회수 기능 수정
코딍코딍
2022. 8. 17. 14:27
페이징
게시판 리스트를 보여주는 뷰에 페이징을 사용하였다. 페이징을 잘 몰라서 매우 간단하게 구현하였다.
BoardController
@Controller
@RequiredArgsConstructor
@RequestMapping("/board")
@Slf4j
public class BoardController {
private final BoardService boardService;
private final MemberService memberService;
private final BoardCommentService boardCommentService;
@GetMapping("/boardList")
public String boardList(Model model,
@PageableDefault(page=0, size=10) Pageable pageable) {
Page<Board> boards = boardService.findAll(pageable);
int nowPage = boards.getPageable().getPageNumber() + 1;
int startPage = Math.max(1, nowPage - 4);
int endPage;
if(boards.getTotalPages()==0) endPage = 1;
else endPage = Math.min(nowPage + 5, boards.getTotalPages());
log.info(nowPage + " " + startPage + " " + endPage);
model.addAttribute("boards", boards);
model.addAttribute("nowPage", nowPage);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
return "/board/boardList";
}
...
- @PageableDefault(page=0, size=10) : 페이지 0으로 설정, 한 페이지당 Board 10개
- nowPage: 현재 페이지, pageable은 페이지 0부터 시작하기에 +1
- startPage: 시작 페이지, 1과 (현재 페이지 - 4) 중 큰 값
- endPage: 끝 페이지
- 현재 생성된 페이지가 없다면 1
- 있다면 전체 페이지 수와 (현재 페이지 + 5) 중 작은 값
BoardService
@Transactional(readOnly = true)
public Page<Board> findAll(Pageable pageable) {
return boardRepository.findAll(pageable);
}
- findAll() - 변경
- 반환형 변경, (List<Board> -> Page<Board>)
- 인자 추가, (Pageable pageable)
- 인수 추가, boardRepository.findAll(pageable)
boardList.html
<div class="container">
<div class="row">
<div class="col">
<ul class="pagination">
<li class="page-item" th:each="page : ${#numbers.sequence(startPage, endPage)}">
<a class="page-link" th:if="${page != nowPage}" th:href="@{/board/boardList(page=${page-1})}" th:text="${page}"></a>
<a class="page-link" th:if="${page == nowPage}" th:text="${page}"></a>
</li>
</ul>
</div>
</div>
</div>
- 페이지 번호 출력하는 코드 추가

조회수 기능 수정
이전에 만든 조회수 기능은 해당 게시글을 들어가서 새로고침 하면 증가, 글 수정하면 증가, 댓글 작성하면 증가되었다. 이는 옳지 않은 기능이기에 게시판 리스트에서 해당 글을 조회할 때만 조회수가 증가하도록 리팩터링 하였다. PRG패턴을 사용하여 변경하였는데 PRG가 아니라 GRG이다.
BoardController
@Controller
@RequiredArgsConstructor
@RequestMapping("/board")
@Slf4j
public class BoardController {
private final BoardService boardService;
private final MemberService memberService;
private final BoardCommentService boardCommentService;
@GetMapping("/visit/{boardId}")
public String visit(@PathVariable Long boardId, RedirectAttributes redirectAttributes) {
boardService.countVisitIncrease(boardId);
redirectAttributes.addAttribute("boardId", boardId);
return "redirect:/board/content/{boardId}";
}
@GetMapping("/content/{boardId}")
public String content(@PathVariable Long boardId, Model model,
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) MemberDto memberDto) {
Board board = boardService.findOne(boardId);
String mine = boardService.myContent(memberDto.getId(), board.getMember().getId());
BoardDto boardDto = new BoardDto(board);
List<BoardComment> boardComments = boardCommentService.findAll(boardId);
model.addAttribute("boardComments", boardComments);
model.addAttribute("boardDto", boardDto);
model.addAttribute("mine", mine);
return "board/boardContent";
}
@PostMapping("/edit/{boardId}")
public String edit(@PathVariable Long boardId, @ModelAttribute BoardDto boardDto,
RedirectAttributes redirectAttributes) {
...
return "redirect:/board/content/{boardId}";
}
@PostMapping("/comment/{boardId}")
public String addcomment(@PathVariable Long boardId, @ModelAttribute BoardCommentDto boardCommentDto,
...
return "redirect:/board/content/{boardId}";
}
}
- visit() : 게시글 조회 시 처음 실행, 조회수 증가 후 게시글 조회
- content(): 게시글 조회
- edit(): 경로 변경
- addcomment(): 경로 변경
BoardService
@Service
@RequiredArgsConstructor
@Transactional
public class BoardService {
private final BoardRepository boardRepository;
...
public void countVisitIncrease(Long boardId) {
Board board = findOne(boardId);
board.countVisitIncrease();
return;
}
}
- countVisitIncrease(): 반환형 변경 (Board -> void)
boardList.html
...
<tr th:each="board : ${boards}">
<td><a th:href="@{'/board/visit/' + ${board.id}}"><span th:text="${board.id}"></span></a></td>
...
- 게시글 조회 시 경로변경 (조회수 증가 후 조회)