728x90
게시글이 한 줄로 1부터 100000개가 나열되면 불편하겠죠. 불편을 해결하기 위해 페이징 기능을 구현해봅시다.
BoardController
@GetMapping("/board/list")
public String list(Model model, @PageableDefault(size = 5, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) {
List<BoardListDto> boardList = boardService.getBoardList(pageable);
Integer[] pageList = boardService.getPageList(pageable);
model.addAttribute("postList", boardList);
model.addAttribute("pageList", pageList);
return "board/list.html";
}
spring에서 Page 관련한 API들을 제공하고 있습니다. @PageableDefault의 size는 한 페이지에 몇 개의 게시글을 보여줄건지 나타냅니다. 저는 최신글부터 예전글 순서로 보여주고 싶어서 id 기준으로 정렬했습니다.
BoardService
@Transactional
public List<BoardListDto> getBoardList(Pageable pageable){
return boardRepository.findAll(pageable).stream()
.map(BoardListDto::new)
.collect(Collectors.toList());
}
@Transactional
public Integer[] getPageList(Pageable pageable){
Page<Board> boardList = boardRepository.findAll(pageable);
int pageNum = boardList.getPageable().getPageNumber();
int totalPage = boardList.getTotalPages();
Integer[] pageList = new Integer[totalPage];
int startPage = ((pageNum)/BLOCK_PAGE_NUM_COUNT)*BLOCK_PAGE_NUM_COUNT+1;
int endPage = startPage+BLOCK_PAGE_NUM_COUNT-1;
endPage = totalPage<endPage?totalPage:endPage;
for(int i = 0; i < endPage;i++){
pageList[i] = i;
}
return pageList;
}
예전에는 findAllDesc 를 이용했습니다만 Controller에서 Sort를 해주고 있으므로 필요가 없어졌습니다. 단순히 페이징 기능만 구현할거면 getPageList는 없어도 됩니다. url에 ?page=0 혹은 ?page=1을 붙여보면 기능이 제대로 구현된걸 눈으로 확인할 수 있습니다. (테스트 코드로도 볼 수 있음) getPageList는 프론트에서 0,1,2,3,4..등 나열하기 위해서 작성한 메서드입니다.
이걸 구현할때 boardRepository.findAll(pageable)이 중복되고 있잖아요. 이것만 따로 빼는게 옳은지.. 애매해서 일단은 저렇게 구현했지만 나중에 다시 생각해봐야겠습니다.
728x90
'web > spring&spring boot' 카테고리의 다른 글
[Spring Batch] Spring Batch의 장점 (0) | 2022.02.26 |
---|---|
[Spring] REST API 구현 (0) | 2021.11.07 |
[spring boot] 스프링 부트 게시판 검색 기능 구현하기 (0) | 2021.06.06 |
[spring boot] 스프링 부트 게시판 글 삭제 구현하기 (0) | 2021.06.05 |
[spring boot] 스프링 부트 게시판 수정하기 기능 추가 (0) | 2021.05.27 |