저번 포스팅에서 순수 JPA를 통해 페이징을 적용하는 방법에 대해 알아보았다.
Spring Data JPA를 사용하면 정말 편리하게 PageRequest를 따로 만들필요없이 페이징 적용이 가능하다.
하지만 Spring Data JPA도 Page와 Pageable 인터페이스를 사용하기 때문에 해당 인터페이스에 대한 설명은 아래 포스팅을 참고하는 걸 추천한다.
페이징 적용
파라미터로 Pageable 인터페이스를 받고 다음과 같이 Page<엔티티>를 반환하면 페이징이 적용된다.
@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
추가로 Mapping URI 뒤에 요청 파라미터를 추가하여 결과를 얻을 수 도 있다.
// page는 0부터 시작, 한 페이지당 크기 3, id 기준 내림차순 & username 기준 내림차순
/members?page=0&size=3&sort=id,desc&sort=username,desc
기본값
pageable의 JSON 값을 보면 시작 페이지는 0부터 시작, 한 페이지당 크기(Size)는 20으로 기본 설정되어 있는 것을 볼 수 있다.
페이징 옵션 글로벌 설정
해당 기본 값을 원하는 값으로 바꿔 글로벌 적용을 한다면, 다음과 같이 apllication.properties에 코드를 추가하면 된다.
spring.data.web.pageable.default-page-size=20 // 기본 페이지 사이즈
spring.data.web.pageable.max-page-size=2000 // 최대 페이지 사이즈
페이징 옵션 개별 설정 (@PageableDefault)
개별 적용을 한다면 다음과 같이 @PageableDefault 어노테이션을 사용하여 개별 적용할 수 있다.
@GetMapping("/membersPage")
public Page<Member> pageList(@PageableDefault(size = 5, sort = "username", direction = Direction.DESC) Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
페이지당 크기(size), 정렬 조건(sort), 정렬 기준(direction)을 적용할 수 있다.
한 페이지에 여러 페이징 적용
만약 하나의 페이지에 둘 이상의 엔티티를 페이징 해야 할 경우 다음과 같이 @Qualifier 어노테이션을 사용하여 접두사로 구분해 사용할 수 있다.
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable,
...
}
DTO로 변환하여 반환
엔티티를 직접 반환하는 것은 상당히 위험하다고 하였다. (자세한 내용은 아래 포스팅 참조)
List형식인 엔티티를 DTO로 변환하는데 Page 인터페이스가 제공해주는 map() 메서드를 사용하여 다음과 같이 람다식으로 변환할 수 있다.
@GetMapping("/membersPage")
public Page<MemberDto> pageList(@PageableDefault(size = 5, sort = "username", direction = Direction.DESC) Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
return page.map(member -> MemberDto.builder()
.id(member.getId())
.username(member.getUsername())
.build());
}
'◼ JPA' 카테고리의 다른 글
[Spring Data JPA] @EntityGraph 엔티티 그래프란? (0) | 2023.06.20 |
---|---|
[JPA] 페이징과 정렬에 대해 알아보자. (0) | 2023.06.20 |
[Spring Data JPA] 쿼리 생성 기능과 반환 타입 (0) | 2023.06.20 |
[JPA] 컬렉션 조회 시 주의할 점 (hibernate.default_batch_fetch_size) (0) | 2023.06.20 |
JpaRepository를 상속한 인터페이스가 구현체가 없이 동작하는 이유 (0) | 2023.06.19 |