스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다.

 

페이징과 정렬 예제

@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
page: 현재 페이지, 0부터 시작한다.
size: 한 페이지에 노출할 데이터 건수
sort: 정렬 조건을 정의한다. 예) 정렬 속성,정렬 속성...(ASC | DESC), 정렬 방향을 변경하고 싶으면 sort파라미터 추가 ( asc 생략 가능)

 

 

 

기본값

글로벌 설정: 스프링 부트

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) {
 ...
}

 

 

접두사

페이징 정보가 둘 이상이면 접두사로 구분
@Qualifier 에 접두사명 추가 "{접두사명}_xxx”
예제: /members?member_page=0&order_page=

public String list(
 @Qualifier("member") Pageable memberPageable,
 @Qualifier("order") Pageable orderPageable, ...

 

Page 내용을 DTO로 변환하기

엔티티를 API로 노출하면 다양한 문제가 발생한다. 그래서 엔티티를 꼭 DTO로 변환해서 반환해야 한다.
Page는 map() 을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.

 

 

Member DTO

@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;
}
@GetMapping("/members")
public Page<MemberDto> list(Pageable pageable) {
 return memberRepository.findAll(pageable).map(MemberDto::new);
}

 

 

 

 

 

 

출처 : 김영한 JPA 스프링 데이터 강의

'JPA > JPA-Spring Data' 카테고리의 다른 글

새로운 엔티티를 구별하는 방법  (0) 2022.07.23
스프링 데이터 JPA 구현체 분석  (0) 2022.07.22
Web 확장 - 도메인 클래스 컨버터  (0) 2022.07.22
Auditing  (0) 2022.07.21
사용자 정의 리포지토리 구현  (0) 2022.07.21
복사했습니다!