Spring Data JPA Paging 1부터 시작하기

jylee·2024년 4월 18일
0

그냥생각나는거

목록 보기
47/48

MemberController

@GetMapping("/members")
public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable) {
	return memberRepository.findAll(pageable).map(MemberDto::new);
}

MemberDto

@Data
public class MemberDto {
    private Long id;
    private String username;
    private String teamName;

    public MemberDto(Long id, String username, String teamName) {
        this.id = id;
        this.username = username;
        this.teamName = teamName;
    }

    public MemberDto(Member member) {
        this.id = member.getId();
        this.username = member.getUsername();
        this.teamName = member.getTeam().getName();
    }
}

http://localhost:8080/members 호출 시 데이터

// 20240418144752
// http://localhost:8080/members

{
  "content": [
    {
      "id": 1,
      "username": "user0",
      "teamName": "teamA"
    },
    {
      "id": 2,
      "username": "user1",
      "teamName": "teamB"
    },
    {
      "id": 3,
      "username": "user2",
      "teamName": "teamA"
    },
    {
      "id": 4,
      "username": "user3",
      "teamName": "teamB"
    },
    {
      "id": 5,
      "username": "user4",
      "teamName": "teamA"
    }
  ],
  "pageable": {
    "pageNumber": 0,
    "pageSize": 5,
    "sort": {
      "empty": true,
      "sorted": false,
      "unsorted": true
    },
    "offset": 0,
    "paged": true,
    "unpaged": false
  },
  "last": false,
  "totalPages": 20,
  "totalElements": 100,
  "size": 5,
  "number": 0,
  "sort": {
    "empty": true,
    "sorted": false,
    "unsorted": true
  },
  "first": true,
  "numberOfElements": 5,
  "empty": false
}

page가 0으로 출력된다.

직접 PageRequest(Pageable 구현체)를 생성

MyPage

@Getter
public class MyPage {
    private final List<MemberDto> content;
    private final MyPageable pageable;
    private final boolean last;
    private final long totalElements;
    private final int totalPages;
    private final int size;
    private final int number;
    private final Sort sort;
    private final boolean first;
    private final int numberOfElements;
    private final boolean empty;

    public MyPage(Page<Member> page) {
        this.content = page.getContent().stream().map(MemberDto::new).toList();
        this.pageable = new MyPageable(page.getPageable());
        this.last = page.isLast();
        this.totalElements = page.getTotalElements();
        this.totalPages = page.getTotalPages();
        this.size = page.getSize();
        this.number = page.getNumber() + 1;
        this.sort = page.getSort();
        this.first = page.isFirst();
        this.numberOfElements = page.getNumberOfElements();
        this.empty = page.isEmpty();
    }
}

MyPageable

@Getter
public class MyPageable {
    private final int pageNumber;
    private final int pageSize;
    private final Sort sort;
    private final long offset;
    private final boolean unpaged;
    private final boolean paged;
    public MyPageable(Pageable pageable) {
        pageNumber = pageable.getPageNumber() + 1;
        pageSize = pageable.getPageSize();
        sort = pageable.getSort();
        offset = pageable.getOffset();
        unpaged = pageable.isUnpaged();
        paged = pageable.isPaged();
    }
}

MemberController 메소드 추가

@GetMapping("/members2")
public MyPage list(
        @RequestParam(value = "page", required = false, defaultValue = "1") int page,
        @RequestParam(value = "size", required = false, defaultValue = "5") int size,
        @RequestParam(value = "sort", required = false, defaultValue = sortDefaultValue) String sort) {
    if (page < 1) {
        page = 1;
    }

    String[] split = sort.split(",");
    PageRequest pageRequest = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.fromString(split[1]), split[0]));
    Page<Member> pageObject = memberRepository.findAll(pageRequest);
    MyPage myPage = new MyPage(pageObject);
    return myPage;
}
  • page, size, sort를 Pageble이 아닌 직접 받도록 변경
  • Page<Member> 객체를 직접 만든 MyPage 클래스 생성자에 전달
  • 메소드 리턴 값을 Page<MemberDto>가 아닌 MyPage로 변경

http://localhost:8080/members2 호출 시 데이터

// 20240418144852
// http://localhost:8080/members2

{
  "content": [
    {
      "id": 1,
      "username": "user0",
      "teamName": "teamA"
    },
    {
      "id": 2,
      "username": "user1",
      "teamName": "teamB"
    },
    {
      "id": 3,
      "username": "user2",
      "teamName": "teamA"
    },
    {
      "id": 4,
      "username": "user3",
      "teamName": "teamB"
    },
    {
      "id": 5,
      "username": "user4",
      "teamName": "teamA"
    }
  ],
  "pageable": {
    "pageNumber": 1,
    "pageSize": 5,
    "sort": {
      "empty": false,
      "sorted": true,
      "unsorted": false
    },
    "offset": 0,
    "unpaged": false,
    "paged": true
  },
  "last": false,
  "totalElements": 100,
  "totalPages": 20,
  "size": 5,
  "number": 1,
  "sort": {
    "empty": false,
    "sorted": true,
    "unsorted": false
  },
  "first": true,
  "numberOfElements": 5,
  "empty": false
}

page가 1로 출력된다.

profile
ㅎㅇ

0개의 댓글