참고: Pageable을 이용한 Pagination을 처리하는 다양한 방법
Pagination
조회할 데이터 개수가 많을 때, 한 번에 조회되는 데이터의 개수를 한정시켜 페이지 단위로 나누는 기법
- 정렬 방식, 페이지 크기, 불러올 페이지 번호 등 지정할 수 있다.
- 조회할 데이터 개수가 적어진다 > 성능 향상
- 사용자가 데이터를 확인하는 과정에서 확인해야 하는 데이터가 줄어든다 > UX 향상
Pagination 방법
- JpaRepository 사용repository.findTop20ByIdLessThanOrderByIdDesc(Long id)
repository.findTop20ByOrderByIdDesc() - Pageable 객체 이용
Pageable 인터페이스
JPA에서 제공하는 Pageable 객체를 이용하면 페이징을 더 쉽게 할 수 있다.
- 조회하고 싶은 페이지의 정보를 담는 객체 (페이지 번호, 페이지 크기, 정렬 방식 …)
- 쿼리 파라미터 형식으로 페이지 정보를 보내서 원하는 데이터를 얻는다.
ex) ‘page=3&size=10&sort=id,DESC’ : id로 오름차순 정렬한 데이터 중 한쪽에 10개 글 구성의 3 번째 페이지를 요청
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
Pageable JPA 사용하기
컨트롤러에서 Pageable 객체를 인수로 넘겨주고 GET 요청에 페이지 정보를 쿼리 파라미터 형식으로 전달하면, JpaRepository로 부터 원하는 page 만큼 ArticleDto 목록을 받을 수 있다.
- GET /articles?title=spring&page=3&size=10&sort=id,DESC
- 컨트롤러에 Pageable 객체를 인수로 설정 > 위 같은 요청이 들어오면, 자동으로 page=3&size=10&sort=id,DESC에 해당하는 Pageable 객체를 만든다. 그렇게 생성된 Pageable 객체를 repository에 넘겨주기만 하면 된다.
public interface ArticleRepository extends JpaRepository<ArticleEntity, Long> {
List<ArticleEntity> findByByTitle(String title, Pageable pageable);
}
@Controller
public class ArticleController {
private final ArticleRepository repository;
@GetMapping("/articles")
public List<ArticleDto> read(@RepuestParam Long title, Pageable pageable) {
return repository.findByByTitle(title, pageable);
}
}
내부 동작 살펴보기
org.springframework.data.web 패키지 안에 정의된 ArgumentResolver인 PageableHandlerMethodArgumentResolver에 의해 쿼리 파라미터가 Pageable 객체로 전환된다.
- Pageable의 파라미터가 요청으로 들어오면, resolveArgument() 로직이 실행된다.
public class PageableHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolverSupport
implements PageableArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return Pageable.class.equals(parameter.getParameterType());
}
@Override
public Pageable resolveArgument() {
//생략
}
}
참고) 기본 설정 수정하기
쿼리 파라미터로 페이지 정보를 주지 않는 경우, fallbackPageable에 정의된 형식으로 페이징 수행한다. JPA는 페이징 기본값을 수정하는 어노테이션을 제공한다.
- @PageDefault :
Pageable 객체 앞에 붙여서 기본값을 설정할 수 있음
@Controller
public class ArticleController {
@GetMapping("/articles")
public List<ArticleDto> findByTitle (
@RequestParam String title,
@PageDefault(size=100, sort="id", direction = Sort.Direction.DESC) Pageable pageable
) {
// 생략
}
}
'CS > Backend' 카테고리의 다른 글
[Spring] @Valid와 @Validated를 이용한 유효성 검증 (0) | 2023.06.29 |
---|---|
[Spring] 서블릿, HTTP request & response (0) | 2023.06.27 |
[Java] 직렬화, 역직렬화 (0) | 2023.06.25 |
[Spring] REST, REST API (0) | 2023.06.23 |
[Spring] 웹 애플리케이션 개념 정리 (0) | 2023.06.22 |