게시판 토이 프로젝트 진행 중 구현한 페이징 처리 과정에 대해서 기록을 하고자 한다.
@Controller
@RequiredArgsConstructor
@RequestMapping("/board")
public class BoardController {
private final BoardService boardService;
private final AnswerService answerService;
//전체 글 목록
@RequestMapping("/all")
public String list(Model model,
@RequestParam(value = "page", defaultValue = "0") int page,
@RequestParam(value = "keyword", defaultValue = "") String keyword) {
Page<BoardDto> boardDtos;
if(keyword.length() == 0) {
boardDtos = boardService.getAll(page);
} else {
boardDtos = boardService.getByKeyword(page, keyword);
}
boardDtos.stream().map(boardDto -> boardDto = answerService.getAnswerCnt(boardDto)).toList();
model.addAttribute("keyword", keyword);
model.addAttribute("boardList", boardDtos);
return "board/list";
}
}
controller에서 검색어가 있고 없고에 따라 getAll과 getByKeyword로 나뉘는데, 이 글에서는 getAll에 대해서만 간단히 기록하려고 한다.
getAll메서드를 보면 page값을 함께 실어 보낸다.
서비스를 보자.
@Service
@RequiredArgsConstructor
public class BoardService {
private final BoardRepository boardRepository;
public Page<BoardDto> getAll(int page) {
//작성일시 역순 정렬
List<Sort.Order> sorts = new ArrayList<>();
sorts.add(Sort.Order.desc("createDatetime"));
//10개 씩
Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
return boardRepository.findAll(pageable).map(Board::toDto);
}
}
서비스에서 보면 글 리스트를 반환하는 getAll의 반환타입이 List가 아닌 Page인 것을 볼 수 있다.
public Page<BoardDto> getAll(int page) {
또한 page를 인자로 받는다.
작성일시로 역순정렬이라는 글 정렬 기준을 넣는 코드도 볼 수 있다.
//작성일시 역순 정렬
List<Sort.Order> sorts = new ArrayList<>();
sorts.add(Sort.Order.desc("createDatetime"));
아래의 of메서드 안의 파라미터는 각각 페이지번호(0~), 한 페이지에 가져올 개수, 정렬 기준을 의미한다.
//10개 씩
Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
그리고 나서 해당 Pageable객체를 repository 메서드의 인자로 넣어주면 된다. findAll()과 같이 받는 값이 없으면 findAll(pageable)과 같이 넣어주면 되고, 파라미터를 필요로 하는 경우에는 가장 마지막에 인자로 넣어주면 된다.
ex
Page<Board> findByKeyword(String keyword, Pageable pageable);