spring mvc에서 페이징 처리(페이지네이션)

Backend kwon·2023년 9월 22일
0

⚫간단한 페이징 처리 방법

 

🟦Controller 에서의 처리

@GetMapping
    public ResponseEntity getOrders(@Positive @RequestParam int page,
                                    @Positive @RequestParam int size) {
        Page<Order> pageOrders = orderService.findOrders(page - 1, size);
        List<Order> orders = pageOrders.getContent();

       return new ResponseEntity<>(new MultiResponseDto<>(mapper.ordersToOrderResponseDtos(orders), pageOrders), HttpStatus.OK);
    }

@RequestParam으로 page와 size를 받아옵니다.

우리가 사용하고자 하는 Pageable 의 page객체 는 0 부터 시작합니다. 그러므로 controller 단이나 service단에서 page를 -1 처리 해주는 작업이 필요합니다.

(위에서는 controller에서 처리해 주었습니다.)

 

🟦service 에서의 처리

service에서의 findOrders 메서드를 보면

public Page<Order> findOrders(int page, int size) {
        return orderRepository.findAll(PageRequest.of(page, size,
                Sort.by("orderId").descending()));
    }

JpaRepository를 사용하여 쿼리 메서드에 Pageable 인터페이스로 파라미터를 넘기면 페이징을 사용할 수 있습니다. 그리고 반환 타입은 Page 인터페이스입니다.

Pageable은 인터페이스이므로 실제로 사용할 때에는 인터페이스를 구현한 PageRequest 객체를 사용합니다.

(PageRequest 생성자의 파라미터는 현재 페이지, 조회할 데이터 수, 정렬 정보를 파라미터로 사용할 수 있습니다.)

 

🟦추가적으로 페이지와 관련된 클래스를 만들어 준다

PageInfo

@Getter
@AllArgsConstructor
public class PageInfo {
    private int page;
    private int size;
    private int totalElements;
    private int totalPages;
}

PaginationResponseDto

@Getter
@AllArgsConstructor
public class PaginationResponseDto<T> {
    private List<T> data;
    private PageInfo pageInfo;
}

위와 같이 데이터 정보와 페이지 정보를 같이 보내주는 작업이 필요합니다.
이러한 responseDto가 필요하므로 필요에 따라서 쓸 수 있게

public class ResponseDto {
  @Getter
  @AllArgsConstructor
  public static class SingleResponseDto<T> {
      private T data;
  }

  @Getter
  public static class MultipleResponseDto<T> {
      private List<T> data;
      private PageInfo pageInfo;

      public MultipleResponseDto(List<T> data, Page page) {
          this.data = data;
          this.pageInfo = new PageInfo(page.getNumber() + 1, page.getSize(), page.getTotalElements(), page.getTotalPages());
      }
  }

  @Getter
  public static class MultipleInfoResponseDto<T> {
      private T data;
      private PageInfo pageInfo;

      public MultipleInfoResponseDto(T data, Page page) {
          this.data = data;
          this.pageInfo = new PageInfo(page.getNumber() + 1, page.getSize(), page.getTotalElements(), page.getTotalPages());
      }
  }
}

PaginationResponseDto을 따로 빼는 것이 아니라
이러한 방식으로 한번에 responseDto를 처리 해주는 것이 편리합니다.

그래서 controller에서 pageinfo 객체를 생성해서 처리하는 것이 아닌, responseDto에서 page객체에서 필요한 해당 pageInfo의 멤버 값만을 responseEntity에 알맞게 보내 줄 수 있게 처리해 줍니다.

profile
백엔드개발자를 향해서

0개의 댓글