페이징&정렬(Web 확장)

Mina Park·2022년 10월 15일
0

spring mvc에서 spring data jpa가 제공하는 페이징&정렬 기능 활용

1. 사용예시

  • controller
    • 파라미터로 pageable(인터페이스)를 받으면, 실제는 org.springframework.data.domain.PageRequest 객체가 생성
 @GetMapping("/members")
    public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable) {
        Page<Member> page = memberRepository.findAll(pageable);
        Page<MemberDto> res = page.map(member -> new MemberDto(member));//dto로 변환
        return res;
    }

2. 페이징 관련 기본값 설정

  • 글로벌 설정(스프링 부트)
spring.data.web.pageable.default-page-size=20 /# 기본 페이지 사이즈/
spring.data.web.pageable.max-page-size=2000 /# 최대 페이지 사이즈/
  • 개별 설정: @PageableDefault 어노테이션 적용
@RequestMapping(value = "/members_page", method = RequestMethod.GET)
public String list(@PageableDefault(size = 12, sort = “username”,
direction = Sort.Direction.DESC) Pageable pageable) {
...
}

3. DTO로 변환하여 내보내기

  • 엔티티를 외부로 노출하지 말고 반드시 DTO로 변환
  • Page 객체의 경우 map()을 지원하여 내부 데이터를 다른 객체로 변경 가능
  • MemberDTO
@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를 1부터 시작하기

  • 필요시 Pageable, Page를 파라미터/응답값으로 그대로 사용하지말고 직접 클래스 만들어서 처리하거나 파라미터로 넘어오는 인덱스를 아예 1부터 사용하도록 설정할 수는 있음
  • 가급적 권장 x

0개의 댓글