@GetMapping("/members")
public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable) {
return memberRepository.findAll(pageable).map(MemberDto::new);
}
@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();
}
}
// 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으로 출력된다.
@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();
}
}
@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();
}
}
@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<Member>
객체를 직접 만든 MyPage 클래스 생성자에 전달Page<MemberDto>
가 아닌 MyPage로 변경// 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로 출력된다.