// 로그인한 회원이 등록한 관심 상품 조회
@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페이지로 보내준다고 한다면 추가할 필요는 없다.
// 회원 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을 통해 오름차순 내림차순을 구현할 수 있다.
ex) Sort idSort = Sort.by("id");
Sort nameSort = Sort.by("name"):
Sort idNameSort = idSort.and(nameSort);
오버로딩을 통해 sort(정렬 기준 컬럼 정보, Sort 객체) 파라미터도 함께 사용할 수 있는데, 이 경우 페이징과 정렬이 동시에 처리된다.
public interface ProductRepository extends JpaRepository<Product, Long> {
Page<Product> findAllByUserId(Long userId, Pageable pageable);
}