Spring Data JPA
[Spring Data JPA] Web 확장 - 페이징과 정렬 🍀
woochii
2023. 12. 26. 12:04
728x90
반응형
페이징과 정렬
예제
@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
// 테스트용 데이터
@PostConstruct
public void init() {
for (int i = 0; i < 100; i++) {
memberRepository.save(new Member("user"+i, i));
}
}
- 파라미터로 Pageable을 받을 수 있다.
- Pageable은 인터페이스이다.
- 실제로는 org.springframework.data.domain.PageRequest 객체를 생성한다.
요청 파라미터
- page : 현재 페이지, 0부터 시작한다.
- size : 한 페이지에 노출할 데이터 건수 (설정하지 않으면 20개씩 노출된다.)
- sort : 정렬 조건을 정의한다. (Ex. sort=id,desc)
기본값 설정
- 한 페이지에 노출되는 데이터 건수는 기본이 20이다.
- 이것을 10개로 변경하고 싶다면?
글로벌 설정
Application.yml
spring:
data:
web:
pageable:
default-page-size: 10 // 기본 페이지 사이즈
max-page-size: 2000 // 최대 페이지 사이즈
개별 설정
@GetMapping("/members")
public Page<Member> list(@PageableDefault(size = 10) Pageable pageable) {
return memberRepository.findAll(pageable);
}
- @PageableDefault 어노테이션을 사용한다.
- size 뿐만 아니라 page, sort, direction 등 다양한 개별 설정이 가능하다.
접두사
- 페이징 정보가 둘 이상이면 접두사로 구분한다.
- @Qualifier에 접두사명을 추가한다.
- Ex. "/members?member_page=0&order_page=1"
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable,
...
)
Page 내용을 DTO로 변환
- 엔티티를 API로 노출하면 다양한 문제들이 발생한다.
- 그래서 반드시 엔티티를 DTO로 변환하여 반환해야 한다.
- Page는 map()을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.
MemberDto
@Data
@AllArgsConstructor
public class MemberDto {
private Long id;
private String username;
private String teamName;
public MemberDto(Member member) {
this.id = member.getId();
this.username = member.getUsername();
}
}
@GetMapping("/members")
public Page<MemberDto> list(@PageableDefault(size = 10) Pageable pageable) {
return memberRepository.findAll(pageable)
.map(MemberDto::new); // map()으로 MemberDto로 변환
}
Page를 1부터 시작하기
- 스프링 데이터는 Page를 0부터 시작한다.
- 1부터 시작하고 싶다면 두 가지 방법이 있다.
- Pageable, Page를 파라미터와 응답 값으로 사용하지 않고 직접 클래스를 만들어서 처리한다.
- 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다.
- 물론 응답값도 Page 대신에 직접 만들어서 제공해야 한다.
- spring.data.web.pageable.one-indexed-parameters를 true로 설정한다.
- 이 방법은 web에서 page 파라미터를 -1 처리할 뿐이다.
- 따라서 응답값인 Page에 모두 0 페이지 인덱스를 사용하는 한계가 있다.
Application.yml
spring:
data:
web:
pageable:
one-indexed-parameters: true
- Page 객체 안에 데이터들이 잘 안맞는다.
- Ex. 파라미터로 넘긴 page는 2지만 pageNumber, number는 1이다.
출처 : 인프런 실전! 스프링 데이터 JPA
728x90
반응형