Spring Data JPA - 페이징 SORT 관련 처리

Jobmania·2023년 3월 7일
0

JPA (Baeldung 실습)

목록 보기
1/3
post-thumbnail

Controller

 // 로그인한 회원이 등록한 관심 상품 조회
    @GetMapping("/api/products")
    public Page<Product> getProducts(
            @RequestParam("page") int page,
            @RequestParam("size") int size,
            @RequestParam("sortBy") String sortBy,
            @RequestParam("isAsc") boolean isAsc,
            @AuthenticationPrincipal UserDetailsImpl userDetails) {
// 로그인 되어 있는 회원 테이블의 ID
        Long userId = userDetails.getUser().getId();

        page = page - 1;
        return productService.getProducts(userId, page, size, sortBy, isAsc);
    }

QueryParameter로 페이지, 페이지 사이즈, 정렬방식, 정렬순서를 받아온다고 하자.
여기서 페이지는 0부터 시작하기 때문에 받아온 page number에서 -1 해준다. 만약 프론트 측에서 1페이지를 0페이지로 보내준다고 한다면 추가할 필요는 없다.

Service

// 회원 ID 로 등록된 상품 조회
    public Page<Product> getProducts(Long userId,
    			int page, int size, String sortBy, boolean isAsc) {
        Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
        // Sort 객체를 생성할 때 사용하는 컬럼명은 실제 테이블의 컬럼명이 
        // 아니라 Entity의 속성 이름으로 지정해야 한다.
        Sort sort = Sort.by(direction, sortBy);
        Pageable pageable = PageRequest.of(page, size, sort);

        return productRepository.findAllByUserId(userId, pageable);
    }

sortBy는 Product의 테이블의 Column 의 항목이 들어가고 Sort.Direction을 통해 오름차순 내림차순을 구현할 수 있다.

  • Sort 클래스의 and() 메서드를 통해 여러 컬럼을 정렬 기준으로 삼을 수 있다.

    ex) Sort idSort = Sort.by("id");
    Sort nameSort = Sort.by("name"):
    Sort idNameSort = idSort.and(nameSort);

오버로딩을 통해 sort(정렬 기준 컬럼 정보, Sort 객체) 파라미터도 함께 사용할 수 있는데, 이 경우 페이징과 정렬이 동시에 처리된다.

Repository

public interface ProductRepository extends JpaRepository<Product, Long> {
    Page<Product> findAllByUserId(Long userId, Pageable pageable);
}

Pageble 및 Page 적용된 응답 예시

참고1
참고2

profile
HelloWorld에서 RealWorld로

0개의 댓글