• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Page를 1부터 시작하기(Pageable, Page 커스텀) 질문 있습니다.

22.09.21 14:31 작성 조회수 1.65k

0

안녕하세요. 강의 열심히 듣는 중에 궁금한 점이 있습니다.

17:30초 쯤에 Page를 1부터 시작하기 부분에서

 

1. Pageable, Page를 파리미터와 응답 값으로 사용히지 않고, 직접 클래스를 만들어서 처리한다. 그리고 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다. 물론 응답값도 Page 대신에 직접 만들어서 제공해야 한다.

이 부분을 직접 구현해보려고 했는데 제가 놓치는 부분이 있는 건지 잘 안 되더라구요. 그래서

https://inflearn.com/questions/201572

이 질문에 답변해주신 분의 블로그를 참고하여 커스텀을 해봤습니다.

 package study.datajpa.dto;

import lombok.Getter;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Slice;

@Getter
public class PageableCustom {

    private boolean first;
    private boolean last;
    private boolean hasNext;
    private int totalPages;
    private long totalElements;
    private int page;
    private int size;

    public PageableCustom() {
    }

    public PageableCustom(PageImpl page) {
        this.first = page.isFirst();
        this.last = page.isLast();
        this.hasNext = page.hasNext();
        this.totalPages = page.getTotalPages();
        this.totalElements = page.getTotalElements();
        this.page = page.getNumber() + 1;
        this.size = page.getSize();
    }

    public PageableCustom(Slice slice) {
        this.first = slice.isFirst();
        this.last = slice.isLast();
        this.hasNext = slice.hasNext();
        this.page = slice.getNumber() + 1;
        this.size = slice.getSize();
    }
}

 

package study.datajpa.dto;

import lombok.Getter;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.SliceImpl;

import java.io.Serializable;
import java.util.List;

@Getter
public class PageCustom<T> implements Serializable {

    private List<T> content;

    private PageableCustom pageableCustom;

    public PageCustom(List<T> content, Pageable pageable, long total) {
        this.content = content;
        this.pageableCustom = new PageableCustom(new PageImpl(content, pageable, total));
    }

    public PageCustom(List<T> content, Pageable pageable, boolean hasNext) {
        this.content = content;
        this.pageableCustom = new PageableCustom(new SliceImpl(content, pageable, hasNext));
    }

}

 

@GetMapping("/memberscustom")
public PageCustom<MemberDto> listCustom(Pageable pageable) {
    Page<MemberDto> map = memberRepository.findAll(pageable).map(MemberDto::new);
    return new PageCustom<MemberDto>(map.getContent(), map.getPageable(), map.getTotalElements());
}

결과적으로는 커스텀에 성공했지만 코드 내용부분에서 뭔가 아쉬운 부분이 있더라구요.

이게 블로그 보면서 작성한 MemberController 단 내용인데,

보시면 listCustom(Pageable pageable) 에서

Pageable pageable 이 파라미터를 그대로 하지말고 이 부분 또한 커스텀해서

PageRequest.of()를 이용하라고 설명하시더라구요.

혹시 PageRequest.of()를 활용해서 코드를 좀더 최적화 할 수 없을까요?

제가 놓치는 부분이 있는 것 같은데 잘 떠오르지 않아서 이렇게 질문 드립니다!

 

https://drive.google.com/file/d/1I__dQwuBmtkUdvT5RahN8ksF3Tr21UP8/view?usp=sharing

아! 제 프로젝트 구글 링크 드립니다!ㅎㅎ

 

항상 양질의 강의 감사합니다!

 

답변 1

답변을 작성해보세요.

0

안녕하세요. 이정준님

다른 부분은 더 최적화 하기가 쉽지 않을 듯 하네요. 혹시 더 좋은 아이디어가 있으신 분들을 답변해주시면 좋겠습니다.

다음 부분만 이렇게 고쳐주시면 더 좋을 듯 합니다

public PageableCustom(Page page) {

감사합니다.

Mr.Lee님의 프로필

Mr.Lee

질문자

2022.09.29

감사합니다!!!