티스토리 뷰

상속 관계

JpaRepository > PagingAndSortingRepository > CrudRepository 

 

PagingAndSortingRepository 는 페이징 처리를 위한 메소드를 제공해준다

 

아래의 코드는 PagingAndSortingRepository 인터페이스의 내부 구조이다

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {

	/**
	 * Returns all entities sorted by the given options.
	 *
	 * @param sort
	 * @return all entities sorted by the given options
	 */
	Iterable<T> findAll(Sort sort);

	/**
	 * Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
	 *
	 * @param pageable
	 * @return a page of entities
	 */
	Page<T> findAll(Pageable pageable);
}

Pageable 인터페이스의 구현체인 PageRequest를 파라미터로 사용한다

 

PageRequest.of(,,,) 를 사용하여 객체 생성

Pageable 객체를 생성하기 위해서 사용되는 요청 파라미터

  • page : 가져올 페이지 (기본값 : 0)
  • size : 페이지의 크기 (기본값 : 20)
  • sort : 정렬 기준으로 사용할 속성으로 기본적으로 오름차순으로 한다. 정렬 기준 속성이 2개 이상인 경우에는 sort 파라미터를 2개 이상 넣어주면된다. 예) sort=firstname&sort=lastname,asc.

Pageable 파라미터에 @PageableDefault 어노테이션을 사용하면 디폴트 값을 변경할 수 있다.

 

메소드에 파라미터 추가하기 

Page<User> findByLastname(String lastname, Sort sort);

Page<User> findByLastname(String lastname, Pageable pageable);

JPA는 Pageable, Sort와 같은 특별한 타입의 파라미터를 인식하여 페이징 처리나 정렬을 한다.

 

 

Controller에서의 사용 

@ApiOperation("게시글들 조회")
    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public GetPostsResponse getPosts(
        @RequestParam(required = false, defaultValue = "1") int currentPage,
        @RequestParam(required = false, defaultValue = "10") int size
    ) {
    
        CurrentPageAndPageSize currentPageAndPageSize = PageValidation.getInstance().verify(currentPage, size);

        Page<Post> searchResult = postService.getPosts(
            PageRequest.of(
                currentPageAndPageSize.getCurrentPage() - 1,
                currentPageAndPageSize.getPageSize(),
                Sort.by("createdDate").descending()
            )
        );

        SimplePage simplePage = SimplePage.builder()
                .currentPage(searchResult.getNumber())
                .totalPages(searchResult.getTotalPages())
                .totalElements(searchResult.getTotalElements())
                .build();
        List<DetailedPost> detailedPosts = detailedPostsOf(searchResult.getContent(), userId);

        return new GetPostsResponse(detailedPosts, simplePage);
    }

 

사용자들의 편의를 위해 current Page 의 기본값을 1로 두었다.

이는 PageValidation 에서 적절한 검증 후 CurrentPageAndPageSize 객체로 반환하여 받았다

 

Pageable 객체를 생성하여 PostService에 넘겨 

  public Page<Post> getPosts(Pageable pageable) {
        return postRepository.findAll(pageable);
    }

페이징 처리 메소드를 사용하여 Page 객체를 반환 받았다

 

페이지의 getNumber, getTotalPages ,getTotalElements 등의 메소드를 사용하여 해당 페이지에 대한 정보를 얻어올 수 있다. 

 

참고한 블로그

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함