Back End/Spring Data JPA

[Spring Data JPA] 페이징 page=1 부터 시작하기

DevPing9_ 2022. 9. 25. 20:37

Pageable 의 page

Pageable 의 page 는 0 부터 시작한다.

아래의 application.yml 파일에 옵션을 추가하여 클라이언트에서 ?page=1 을 호출할 시 
limit 0, {size} 쿼리가 나가도록 수정한다.

 

spring:
    data:
        web:
          pageable:
            one-indexed-parameters: true

Slice 객체의 number 필드

JPA 레파지토리에서 반환형을 Slice 로 받을 경우
반환되는 객체의 number 필드가 몇 번째 페이지를 쿼리했는지에 대한 정보를 담고 있다.

위의 yml 파일을 수정해주어도 해당 number 필드는 0부터 시작하고 있다.
이를 따로 Custom Response 를 만들어 반환해주어야 한다. (클라이언트가 원할 시)
data class SeriesContentsResponse(
    val seriesTitle: String,
    val books: List<BookCover>,
    val page: Int,
    val isLast: Boolean,
) {
    companion object {
        fun of(
            seriesTitle: String,
            books: List<BookCover>,
            page: Int,
            isLast: Boolean,
        ): CollectionContentsResponse {
            return CollectionContentsResponse(
                seriesTitle = seriesTitle,
                books = books,
                page = page + 1,
                isLast = isLast
            )
        }
    }
}

왜 Page 객체가 아닌 Slice 객체를 쓰는가?

JPA에서 Page 객체는 LastPage 를 확인하기 위해 count 쿼리 + 조회쿼리 총 2개가 발생된다.
반면 Slice 객체는 조회쿼리(limit +1) 1개만 발생한다.

아래의 포스팅에서 확인할 수 있다.

 

Reference

 

[Spring JPA] JPA의 사실과 오해 (feat. NHN Cloud)

JPA 를 쓰면 쓸수록, 너무 불편한게 많다. 검색으로 원하는 고급정보를 찾기도 어렵다. (정보가 다들 카더라 통신을 통해 대량으로 재생산 되고 있어 깊이가 없을 뿐더러 정확한 검색을 막고 있다

developer-ping9.tistory.com

 

728x90