본문 바로가기
Today I Learned 2024. 6. 7.

(24.06.07)[8주차] Spring Data의 Paging & Sort 정리

팀 과제에서 Feed 즉 게시물을 CRUD 기능 구현을 담당했기 때문에, 조회에 해당하는 부분 중 페이징을 할 수 있는 부분에 대해 생소하기도 하고,

 

필수적이라 반드신 많이 사용될 것이라고 생각하여 스스로 코드를 짜보면서 학습


Spring Data의 Paging & Sort

  • 단순히 DB 에선 데이터를 불러와 정렬하는 방식을 Paging을 통해서 한 페이지당 특정 사이즈이 데이터를 불러오기 & 정렬하는 기준과 정렬순서를 설정할 수 있는 기능을 추가하기 위해 정리
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size, sort);

Page<Product> products = productRepository.findAllByUser(user, pageable);
  • 기본적인 Paging & Sort 활용
    • 정렬순서 -> 방향, Direction
    • 정렬기준 -> Sort
    • 페이징 -> Pageable 객체를 활용해서 Page를 구성

Controller에서 @RequestParam 으로  관련 변수 받기

@GetMapping("/all")
    public ResponseEntity<BaseResDto<List<FeedResDto>>> getAllFeeds(@RequestParam("page") int page,
                                                                    @RequestParam("sortBy") String sortBy,
                                                                    @RequestParam("isAsc") boolean isAsc) {

        BaseResDto<List<FeedResDto>> response = feedService.getAllFeeds(page - 1, sortBy, isAsc);

        return ResponseEntity.status(HttpStatus.OK).body(response);
    }
  • 사이즈= 한 페이지에 표기할 데이터의 수 는 10으로 생략

Service에서의 응답

 public BaseResDto<List<FeedResDto>> getAllFeeds(int page, 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, 10, sort);

        Page<FeedResDto> feedPage = feedRepository.findAll(pageable).map(FeedResDto::new);
        List<FeedResDto> feedList = feedPage.getContent();

        if(feedList.isEmpty()) {
            return new BaseResDto<>(HttpStatus.OK.value(), "먼저 작성하여 소식을 알려보세요!", null);
        }

        return new BaseResDto<>(HttpStatus.OK.value(), "게시물 조회가 완료되었습니다!", feedList);
    }

Sort

  • Spring Data의 Sort 클래스에서 정렬방향과 기준을 결정
    • Direction을 통해서 어떤 방향으로 정렬을 할지를 결정을 할 수 있음
      • ASC 오름차순
      • DESC 내림차순
    • by(방향, 기준) 메서드를 을 통해서 어떤 기준으로 어떤 순서로 정렬을 할지 결정할 수 있음

Paging

  • Sort 객체를 기준으로 Page를 구분할 수 있는 Pageable 객체를 생성
    • Pageable.of(page:시작되는 페이지 번호(0부터 시작), size:한페이지에보여질 데이터 수, sort:정렬 기준, 방향) 을 통해서 Pageable 인터페이스 구현체 즉, Paging을 해서 Page를 결정할 수 있는 객체를 생성
  • Pageable과  이로 만들어진 Page 인터페이스 구현체는 Spring Data JPA에 포함되어있는 인터페이스와 구체적인 구현된 클래스
    • 따라서, JpaRepository가 구현된 Repository 인터페이스의 쿼리 메서드의 변수에 넣어서 직접적으로 구현가능 -> findAll(pageable)  또는 findByUser(user, pageable) 가능
  • Page는 <U> Page<U> map(Function<? super T, ? extends U> converter); 을 포함 즉, map을 사용해서 각 데이터들 page로 매핑을 통해 변환시킬 수 있음 
    • 인터페이스의 여러 메서드 중 getContents()를 통해 페이지에 포함된 데이터 리스트를 반환시킬 수 있음
    • getTotalPages(), getTotalElements(), isFirst() 등의 메서드를 사용가능

Summary

  • Pageable Page 그리고 이에 사용되는 Sort는 어떤 응용되는 것이 아니라 Spring Data에서 지원을 해주는 매우 유용한 기능으로 FE 에서 요구사항을 빠르게 인터페이스 객체를 생성해서  BE에서 그에 맞는 정보를 응답하게 해줄 수 있다
  • 기본적으로 웹 서비스에서는 페이징을 기본으로 가지고 가기 때문에 반드시 외워 둬야하는 부분
\