@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
Pageable
을 받을 수 있다. Pageable
은 인터페이스, 실제는 org.springframework.data.domain.PageRequest
객체 생성/members?page=0&size=3&sort=id,desc&sort=username,desc
sort
파라미터 추가 ( asc
생략 가능)spring.data.web.pageable.default-page-size=20 /# 기본 페이지 사이즈/
spring.data.web.pageable.max-page-size=2000 /# 최대 페이지 사이즈/
@RequestMapping(value = "/members_page", method = RequestMethod.GET)
public String list(@PageableDefault(size = 12, sort = “username”, direction = Sort.Direction.DESC) Pageable pageable) {
...
}
@Qualifier
에 접두사명 추가 "{접두사명}_xxx”/members?member_page=0&order_page=1
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable, ...
map()
을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.@Data
public class MemberDto {
private Long id;
private String username;
public MemberDto(Member m) {
this.id = m.getId();
this.username = m.getUsername();
}
}
Page.map()
사용
@GetMapping("/members")
public Page<MemberDto> list(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
Page<MemberDto> pageDto = page.map(MemberDto::new);
return pageDto;
}
Page.map()
코드 최적화
@GetMapping("/members")
public Page<MemberDto> list(Pageable pageable) {
return memberRepository.findAll(pageable).map(MemberDto::new);
}
Pageable, Page를 파리미터와 응답 값으로 사용히지 않고, 직접 클래스를 만들어서 처리한다. 그리고 직접 PageRequest(Pageable 구현체)를 생성해서 Repository에 넘긴다. 물론 응답 값도 Page 대신에 직접 만들어서 제공해야 한다.
spring.data.web.pageable.one-indexed-parameters를 true로 yml 파일에 설정한다. 그런데 이 방법은 web에서 page 파라미터를 -1 처리할 뿐이다. 따라서 응답 값인 Page에 모두 0 페이지 인덱스를 사용하는 한계가 있다.
one-indexed-parameters
Page 1요청 ( http://localhost:8080/members?page=1 )
{
"content": [
...
],
"pageable": {
"offset": 0,
"pageSize": 10,
"pageNumber": 0 // 0 인덱스
},
"number": 0, // 0 인덱스
"empty": false
}