개요
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
'# Back-End > Spring' 카테고리의 다른 글
Insert문 전에 발생하는 Select문을 제거해보자 (0) | 2023.04.15 |
---|---|
JPA Batch Insert/Update를 적용하여 성능 향상하기 (0) | 2023.04.15 |
@Transactional 어노테이션을 이용한 트랜잭션 관리 (0) | 2023.04.08 |
Logback과 slf4j 간단한 예제 (0) | 2022.09.02 |
Spring Boot Java 8에서 11로 업그레이드 (0) | 2022.08.11 |
[Spring] POI 라이브러리를 이용한 Excel 생성 (0) | 2022.04.23 |
Multi module 프로젝트 구성 (0) | 2022.04.10 |