Paging - 페이징 처리

minjjai·2023년 1월 6일
0

게시판 토이 프로젝트 진행 중 구현한 페이징 처리 과정에 대해서 기록을 하고자 한다.

Code

Controller

@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

@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);
profile
BackEnd Developer

0개의 댓글