본문 바로가기
Spring

[TIL] 240418 Spring Data JPA 페이징 및 정렬 | Pageable, PageableDefault

by studymode 2024. 4. 18.

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

사용자가 정렬을 요청하면 요청한대로 화면 출력