JPA 페이징 관련하여 다양한기능들이나 동작원리, 개념 등 정리가 잘 된 글들이 많다. 추후 참고 해보자.
여기선 예시를 통해 기본으로 간단하게 JPA로 페이징 처리를 해보자.
아래 설명할 예시는 아래의 가이드문서를 참고했습니다.
https://docs.spring.io/spring-data/jpa/docs/2.3.1.RELEASE/reference/html/#reference
우선 가이드 예시를 보면
위의 예시 인터페이스를 보면 findAll 쿼리 메서드에 매개변수를 Pageable을 주고 Page타입으로 받을 수 있다.
가이드 문서에는 위의 구현 예시에서 JPA의 쿼리 메서드에 매개변수 Pageable대신 PageRequest.Of(start, end) 사용 예시가 나와있는데 사용해보니 동적인 게시글 데이터의 페이지번호를 미리 구하고 구하려면 그전에 조회를 한번 더 해줘야 하고.. 불편하고 비효율적인 것 같았다.. 물론 잘 사용하는 분들도 계실듯 하지만.
그냥 아래와 같이 주자.
Page<Board> boards = Repository.findAll(pageable);
끝.. 깔끔하다.
board.get까지만 치고 자동완성만 해봐도 현재 페이지 번호, 전체페이지 갯수, 전체 데이터 갯수등 제공을 다 해준다.
컨트롤러를 한눈에 보자.
전체 게시글 목록을 호출하는 요청이 들어왔다고 해보자. (게시판 페이징 처리)
@GetMapping("/list")
public String list(Model model, @PageableDefault Pageable pageable){
Page<Board> boards = Repository.findAll(pageable);
int startPage = Math.max(1,boards.getPageable().getPageNumber() - 10);
int endPage = Math.min(boards.getTotalPages(), boards.getPageable().getPageNumber() + 10);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
model.addAttribute("boards", boards);
return "board/list";
}
진짜 간단하다
쿼리 메서드 매개변수에 Pageable을 추가해주고 Page타입으로 받아주고 사용하면 끝!
@PageableDefault 어노테이션은 page와 size등 따로 선언 하지 않을 경우 default값으로 전달해 준다.
여기서 한번 확인해야 할 것이 JPA에서 제공하는 page 기본값은 인덱스 '0'부터 시작한다.
startPage와 endPage는 뷰템플릿에서 사용하기 위해 같이 담아 넘겨주었다.
* thymeleaf에서 th:each="page : ${#numbers.sequence(startPage, endPage)} 루프를 돌리는데 사용했다.
* 현재page는 boards.pageable.pageNumber 이처럼 메서드 형식으로 바로 사용할 수 있다.
마지막으로 Model에 담아서 넘겨주면 끝.
검색결과에 따른 페이징 처리라든지 조건과 형식에 따라 다양하게 구현할 수 있다.
Reference
https://docs.spring.io/spring-data/jpa/docs/2.3.1.RELEASE/reference/html/#reference
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
'JPA' 카테고리의 다른 글
[JPA] 더티 체킹(Dirty Checking)? + 동시성 이슈/제어 (2) | 2024.06.13 |
---|---|
[JPA] 엔티티 설계시 주의점 (0) | 2021.11.26 |
[JPA] Pageable 사용 시 Page<Entity>를 Page<DTO>로 변환하기(Builder, 람다식 사용) (1) | 2021.10.26 |
[JPA] 변경 감지(Dirty Checking) 와 병합(merge) (0) | 2021.09.16 |