Spring - Spring Data JPA에서 Paging 구현하기

김상엽·2024년 2월 21일
0

Spring

목록 보기
14/26
post-thumbnail

TIL

JPA 정렬하기

이제 JpaRepository를 다루는건 어느정도 익숙해졌는데, JpaRepository를 사용하면서
객체를 조회할때 Paging를 이용한 정렬을 하는 방법을 알아보자

Controller

    @GetMapping("/folders/{folderId}/products")
    public Page<ProductResponseDto> getProductsInFolder(
            @PathVariable Long folderId,
            @RequestParam("page") int page,
            @RequestParam("size") int size,
            @RequestParam("sortBy") String sortBy,
            @RequestParam("isAsc") boolean isAsc,
            @AuthenticationPrincipal UserDetailsImpl userDetails){
  • 먼저, Controller에서 정렬의 기준이 되는 값들을 받아온다.

Service

   public Page<ProductResponseDto> getProductsInFolder(Long folderId, int page, int size, String sortBy, boolean isAsc, User user) {
       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> productList = productRepository.findAllByUserAndProductFolderList_FolderId(user, folderId, pageable);
       Page<ProductResponseDto> responseDtoList = productList.map(ProductResponseDto::new);
  • 그 다음, Sort.Direction을 통해 오름차순인지, 내림차순인지를 넣어주고,
  • Sort sort = Sort.by()를 통해 정렬기준을 넣어준다.
  • 그리고 Pageable pageable = PageRequest.of() 통해 PageRequest를 만들고,
  • 이후는 기존에 JpaRespository를 사용하는것 처럼 findBy에 pageable을 넣어주면 된다!
  • Page는 객체 변환도 지원하기에 .map()을 통해 바로 객체 변환도 가능하다.


    기존의 코드에서는 findBy로 먼저 객체들을 List로 가져온뒤, 해당 List를 정렬하는 방법으로
    두번에 걸쳐서 정렬을 하였는데, Page를 사용하면 한번에 객체들을 정렬하면서 가져올 수 있다.

오늘의 회고

이전에 필요없는거 같아서 안들었던 강의를 시간이 남아서 들었는데,
예상외의 수확이 있었다! (JpaRepository에 Page사용법)
이제 팀프로젝트 까지 남은건 테스트 하는 법 정도 알려주는거 같은데, 안그래도 저번 프로젝트하면서 테스트하려고 DB를 몇번날린건지 모르겠다. 개꿀일거 같으니까 열심히 들어야겠다.
다음 프로젝트는 아웃소싱 프로젝트라는데, 이전 기수 아웃소싱 프로젝트를 검색해보니까
간단하게 외부 API(로그인, 지도 등등)를 적용해서 프로젝트 만드는거로 보여서 저번 프로젝트 처럼 가볍게 하면 될 거 같다(이번에는 프론트 구현 죽어도 안할예정).
내일 남은 강의 다 듣고 금요일에 어느정도 끝내놓고 주말 편하게 노는게 계획이다.
벌써 2월 말이라니 시간이 너무 빠르다.
정보처리기사 실기랑 영어시험 미뤄놨는데 슬슬 때가 되었다

profile
개발하는 기록자

0개의 댓글