[Spring Data JPA] Pageable을 이용한 Paging 조회
# Back-End/Spring

[Spring Data JPA] Pageable을 이용한 Paging 조회

개요

Paging 처리를 하는 여러 방법 중 Pageable 객체를 사용한 방법을 알아본다.

 

 

 

 

 

코드

 

1. Controller

@RequiredArgsConstructor
@RestController
public class MovieController {

    private final MovieService movieService;

    @GetMapping("api/movies")
    public ApiResponse getMoviesPaging(@RequestParam(defaultValue = "0") Integer pageNo,
                                       @RequestParam(defaultValue = "10") Integer pageSize) {
        Pageable pageable = PageRequest.of(pageNo, pageSize);
        return ApiResponse.OK(movieService.getMoviesPaging(pageable));
    }

}

 

  • Pageable 객체를 바로 메소드 파라미터로 받아도 되지만, 파라미터의 이름을 마음대로 받기 위해 RequestParam으로 받고 Pageable 객체를 생성한다.

 

2. Service

package com.kingpiggy.study.service;

import com.kingpiggy.study.domain.movie.Movie;
import com.kingpiggy.study.domain.movie.MovieRepository;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Slf4j
@RequiredArgsConstructor
@Service
public class MovieService {

    private final MovieRepository movieRepository;

    @Transactional(readOnly = true)
    public Page<Movie> getMoviesPaging(Pageable pageable) {
        return movieRepository.findAll(pageable);
    }

}

 

3. Repository

package com.kingpiggy.study.domain.movie;

import com.kingpiggy.study.domain.movie.Movie;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MovieRepository extends JpaRepository <Movie, Long> {
}

 

 

4. 조회 결과

GET {{API_BASE_URL}}/api/movies?pageNo=3&pageSize=10

 

테스트용 데이터는 35개 생성했고, 한 번에 10개씩 4번째 페이지를 가져오도록 호출해본다.

(Pageable의 page는 0부터 시작)

 

 

[예상 결과]

page 0 : 1 ~ 10 까지의 movie

page 1 : 11 ~ 20 까지의 movie

...

page 3 : 30 ~ 35 까지의 movie

 

 

결과

{
    "transactionTime": "2022-10-01T16:46:00.2840192",
    "code": "OK",
    "message": "OK",
    "data": {
        "content": [
            {
                "id": 31,
                "title": "Sample Movie_31",
                "adult": false,
                "overview": "Overview_31",
                "releaseDate": "2022-10-01"
            },
            {
                "id": 32,
                "title": "Sample Movie_32",
                "adult": false,
                "overview": "Overview_32",
                "releaseDate": "2022-10-01"
            },
            {
                "id": 33,
                "title": "Sample Movie_33",
                "adult": false,
                "overview": "Overview_33",
                "releaseDate": "2022-10-01"
            },
            {
                "id": 34,
                "title": "Sample Movie_34",
                "adult": false,
                "overview": "Overview_34",
                "releaseDate": "2022-10-01"
            },
            {
                "id": 35,
                "title": "Sample Movie_35",
                "adult": false,
                "overview": "Overview_35",
                "releaseDate": "2022-10-01"
            }
        ],
        "pageable": {
            "sort": {
                "empty": true,
                "sorted": false,
                "unsorted": true
            },
            "offset": 30,
            "pageNumber": 3,
            "pageSize": 10,
            "paged": true,
            "unpaged": false
        },
        "last": true,
        "totalPages": 4,
        "totalElements": 35,
        "size": 10,
        "number": 3,
        "sort": {
            "empty": true,
            "sorted": false,
            "unsorted": true
        },
        "first": false,
        "numberOfElements": 5,
        "empty": false
    }
}

 

 

요약

  • Spring Data JPA로도 간단하게 Paging 처리한 조회 API를 구현할 수 있다.
  • 여러 정렬 조건들을 Parameter로 받으면 정렬해서 가져오는 것이 가능하다.
  • JPA의 page는 0부터 시작한다.
728x90