Spring Data JPA를 이용해서 paging 하기
게시판 미션 질문 게시글을 페이징해서 보여주기, 간단히 첫번째 페이지만 보여주는 방법을 정리해보았다.
step1.
Page을 리턴하고 Pageable을 매개변수로 받는 findAll 메소드가 PagingAndSortingRepository 인터페이스에 있다. 이 인터페이스를 JpaRepository인터페이스가 상속받고있다. 현재 나의 QuestionRepository 클래스는 JpaRepository를 상속받고 있다.
// class QuestionRepository extends JpaRepository
Page<Question> findAll(Pageable pageable);
step2.
QuestionService에서 Pageable인터페이스의 구현체인 PageRequest객체를 생성하고, 이를 repository의 findAll 인자로 넘긴다.
PageRequest의 객체는 페이지 번호와 페이지의 크기(한페이지에 보여질 데이터의 수)를 값으로 주고 생성한다.
of라는 정적 팩토리메소드를 사용해서 PageRequest 객체를 생성할 수 있다.
페이지 번호는 0부터 시작한다.
// QuestionService
public Page<Question> getQuestionList(){
Pageable firstPageWithTwoElements = PageRequest.of(0, 5);
return questionRepository.findAll(firstPageWithTwoElements);
}
위의 코드는 한 페이지에 5개의 항목이 보이고(size) 첫번째 페이지를 반환하는 메소드이다.
step3.
이제 QuestionController에서 해당 페이지가 출력하도록 한다.
// QuestionController
@GetMapping("/")
public String list(Model model) {
Page<Question> firstPage = questionService.getQuestionList();
List<Question> pageContents = firstPage.getContent();
model.addAttribute("questions", pageContents);
return "index";
}
getContent 메소드는 페이지에 들어있는 데이터들을 List로 반환한다.
이 List를 가지고 model을 이용하여 뷰로 데이터를 넘겨준다.
시간남으시면 데이터베이스에서 OFFSET LIMIT 키워드로 페이징 하는걸 공부해보셔도 좋을듯 합니다~!
나중에 JPA 안쓰면 아마 저런 방식으로 해야될거에요!
항상 TIL 남기는거 대단하시네요..