Spring Data에서 페이징 및 정렬 구현
- Pageable 인터페이스를 이용하여 손쉽게 페이징, 정렬 처리
- Pageable을 PageRequest 구현체로 구현
- Spring Data JPA의 Query Method 파라미터를 전달해 페이징 및 정렬 처리가 완료된 데이터를 Page타입으로 반환
- 요청 파라미터:
- page: 현재 페이지, 0부터 시작
- size: 조회할 데이터 수
- sort: 정렬 조건, sort 파라미터 추가 가능
코드 예시
🔽 ProductController
// 관심 상품 조회하기
@GetMapping("/products")
public Page<ProductResponseDto> getProducts(
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam("sortBy") String sortBy,
@RequestParam("isAsc") boolean isAsc,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
// 응답 보내기
return productService.getProducts(userDetails.getUser(), page-1, size, sortBy, isAsc);
}
@RequestParam으로 페이지, 사이즈, 정렬 방법 등 전달
🔽 ProductService
public Page<ProductResponseDto> getProducts(User user,
int page, int size, String sortBy, boolean isAsc) {
// 페이징 처리
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size, sort);
// 사용자 권한 가져와서 ADMIN 이면 전체 조회, USER 면 본인이 추가한 부분 조회
UserRoleEnum userRoleEnum = user.getRole();
Page<Product> productList;
if (userRoleEnum == UserRoleEnum.USER) {
// 사용자 권한이 USER 일 경우
productList = productRepository.findAllByUser(user, pageable);
} else {
productList = productRepository.findAll(pageable);
}
return productList.map(ProductResponseDto::new);
}
받아온 정보 (size, sortBy, isAsc)를 findAllByUser(user, pageable)로 springDataJpa로 넘김
🔽 ProductRepository
public interface ProductRepository extends JpaRepository<Product, Long> {
Page<Product> findAllByUser(User user, Pageable pageable);
}
findAllByUser(user, pageable)를 Page타입으로 받기
@PageableDefault
- Pageable 기본값 설정 가능
코드 예시
🔽 ProductController
@GetMapping("/products")
public Page<ProductResponseDto> getProducts(
@PageableDefault(size = 12, sort = "lprice", direction = Direction.DESC)Pageable pageable,
@AuthenticationPrincipal UserDetailsImpl userDetails){
return productService.getProducts(userDetails.getUser(),pageable);
}
개별로 default 설정
아무 설정도 없으면 default 설정으로 출력
🔽 ProductService
public Page<ProductResponseDto> getProducts(User user, Pageable pageable) {
UserRoleEnum userRoleEnum = user.getRole();
Page<Product> productList;
if (userRoleEnum == UserRoleEnum.USER){
productList = productRepository.findAllByUser(user,pageable);
}else {
productList = productRepository.findAll(pageable);
}
return productList.map(ProductResponseDto::new);
}
🔽 Postman 출력 화면
http://localhost:8080/api/products?page=0&size=3&sort=lprice,desc
사용자가 정렬을 요청하면 요청한대로 화면 출력
'Spring' 카테고리의 다른 글
[TIL] 240510 Spring S3 bucket에 사진 추가 | SpringBoot MultipartFile로 이미지 추가하기 (0) | 2024.05.10 |
---|---|
[TIL] 240508 MongoDB 적용하기 | 채팅 DB MySQL에서 MongoDB로 변경 (0) | 2024.05.08 |
[TIL] 240412 즉시로딩, 지연로딩, 영속성 전이, OrphanRemoval (0) | 2024.04.12 |
[TIL] 240409 Entity 연간 관계 | 1:1 매핑, 단방향, 양방향 (0) | 2024.04.09 |
[TIL] 240408 RestTemplate | NaverOpenApi 검색 (0) | 2024.04.08 |