토이 프로젝트/게시판 프로젝트

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>
  • 페이지 번호 출력하는 코드 추가

 

BoardList.html

 

 

조회수 기능 수정

이전에 만든 조회수 기능은 해당 게시글을 들어가서 새로고침 하면 증가, 글 수정하면 증가, 댓글 작성하면 증가되었다. 이는 옳지 않은 기능이기에 게시판 리스트에서 해당 글을 조회할 때만 조회수가 증가하도록 리팩터링 하였다. 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>
...
  • 게시글 조회 시 경로변경 (조회수 증가 후 조회)