티스토리 뷰
상속 관계
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 등의 메소드를 사용하여 해당 페이지에 대한 정보를 얻어올 수 있다.
'BackEnd > SpringBoot' 카테고리의 다른 글
[spring] - Request 흐름과 웹서버 WAS 에 대하여 (0) | 2020.08.23 |
---|---|
[spring] - spring MVC 와 RESTFul 방식의 차이 (0) | 2020.08.23 |
[Debug] - (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 에러 해결 (0) | 2020.08.08 |
[spring] - JUnit4를 이용하여 스프링부트 테스트 하기 (0) | 2020.08.08 |
[spring] - @RequestParam과 @PathVariable의 차이 (0) | 2020.07.28 |