먼저 Paging이 무엇인지 JPA를 사용하여 어떻게 구현 하는지 알아보자!!
Paging은 말 그대로 Page화 하는 것이다. 조회 결과가 너무 많을 경우 일정한 크기를 갖는 페이지로 조회 목록을 쪼개는 것이다. 이를 이용하여 검색 결과나 게시물의 메인페이지를 조회하는 부분에서 유용하게 사용될 수 있습니다.
페이지는 Size, Page, Sort 3가지 값을 필요로 합니다.
처음 해보시는 분들을 위하여 실제 구현한 Controller부터 Service, Repository까지의 예시를 보면서 설명하겠습니다.
@RestController
@RequestMapping("/post")
class PostController(
private final postConverter: PostConverter
private final getLatestPostsService: GetLatestPostsService
) {
// 최신순으로 게시물을 정렬하는 Controller 입니다.
@GetMapping
fun getAllPostList(pageable: Pageable): ResponseEntity<PostListResponse> =
getLatestPostsService.getLatestPost(pageable)
.let { postConverter.toResponse(it) }
.let { ResponseEntity.ok(it) }
}
}
실제 프로젝트에서 http://localhost:8080/post?page=0&size=2 쿼리 스트링을 사용하여 page, size 값을 받았습니다. 이때 Reuqest 값으로는 Pageable 타입으로 받으면 됩니다. 위의 코드를 자세히 볼 필요는 없고 그냥 Request를 어떤 타입으로 받는지만 보시면 될꺼같습니다.
override fun getLatestPosts(pageable: Pageable): List<PostDto> =
postRepository.findAll(
PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("idx").descending())
.toList()
.let { postConverter.toDto(it) }
함수의 내용을 자세히 살펴보면, postRepository에서 findAll() 메소드를 사용하여 모든 게시물을 가져온 뒤, Pageable 인터페이스를 구현한 PageRequest.of()를 사용하여 페이지 번호와 페이지 크기, 그리고 정렬 방식을 지정합니다. 최신순으로 정렬을 하는 API이기 때문에 idx 값을 기준으로 내림차순 정렬을 하도록 설정되어 있습니다.
이처럼 PageRequest.of를 사용하여 Pageable과 Sort를 동시에 진행할 수 있습니다.
PageRequest.of에 대해 설명하진 않았지만 구글링하면 금방 나오니깐 이해가 가질 않으시다면 찾아보는걸 추천해드립니다.