JPA

[JPA] Spring Data JPA를 이용한 페이징 처리

cornarong 2021. 8. 19. 01:55

JPA 페이징 관련하여 다양한기능들이나 동작원리, 개념 등 정리가 잘 된 글들이 많다. 추후 참고 해보자.

여기선 예시를 통해 기본으로 간단하게 JPA로 페이징 처리를 해보자.

 

아래 설명할 예시는 아래의 가이드문서를 참고했습니다.

https://docs.spring.io/spring-data/jpa/docs/2.3.1.RELEASE/reference/html/#reference

 

Spring Data JPA - Reference Documentation

Example 108. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") v

docs.spring.io

 

우선 가이드 예시를 보면

위의 예시 인터페이스를 보면 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(startPageendPage)} 루프를 돌리는데 사용했다.

* 현재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