제목에 JpaRepository 메소드 paging이라고 적긴 했지만
paging은 JpaRepository가 상속받고 있는 PagingAndSortingRepository에서 제공한다.
이렇게 제목을 정한 이유는 이전 포스팅들과 묶어두기 위해...
인터페이스명 그대로 paging과 sorting에 대한 메소드만이 존재한다.
sorting은 다른 포스팅에서 정리하도록 하고 여기서는 paging만 정리.
이전 포스팅과 동일한 환경에서 진행했다.
- Intelli J
- SpringBoot 2.6.2
- Lombok
- Gradle 7.3.2
PagingAndSortingRepository에 들어가보면 Page<T> findAll(Pageable pageable) 메소드를 볼 수 있다.
entitites 페이지를 반환한다는 설명이 붙어있다.
메소드 타입에서 볼 수 있듯이 Page타입으로 사용하면 된다.
@Data
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Entity
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NonNull
private String name;
@NonNull
private String email;
}
public interface UserRepository extends JpaRepository<User, Long>{
}
import org.springframework.data.domain.page
@SpringBootTest
class UserRepositoryTest{
@Autowired
private UserRepository userRepository;
@Test
void crudTest(){
Page<User> users = userRepository.findAll(PageRequest.of(0, 3));
}
paging은 PageRequest.of() 통해 기능을 수행하는데 여기에는 page와 size를 받는다.
page는 zero Index로 0부터 시작하고 size는 해당 페이지에 가져올 데이터의 수이다.
그럼 이제 Page 인터페이스를 좀 봐야한다.
Page는 Slice를 상속받고 있다.
Slice는 의미 그대로 데이터 덩어리의 한 조각이라고 볼 수 있다.
getNumber(), getSize(), getContent() 등 여러 값들을 제공하고 있는데 이 정보들은 현재 Slice에 대한 값이다.
여기서 제일 기본적으로 중요한 부분은 List<T> getContent()다.
getContent는 Returns the page content as {@link List}. 라고 설명되어 있는것을 볼 수 있는데
content를 list로 반환한다는 것이다.
그리고 getSort(), getNumber(), getSize()는 우리가 인자로 제공하는 값을 리턴값으로 다시 받아 제공하는 값이다.
각 메소드 설명을 보면 이해 될만큼 단순한 내용들이 대부분이다.
다시 Page 인터페이스로 돌아와서 보면 getToalpages(), getTotalElements()를 볼 수 있다.
의미 그대로 총 페이지수와 전체 레코드 수를 의미한다.
그럼 슬라이스에 대한 값이 아니라는 것을 알 수 있는데
그래서 슬라이스는 그 부분집합에 대한 각각의 정보들을 제공하고 그것을 상속받는 Page는 그 슬라이스에 대한 정보도 갖고 있지만 전체 페이지에 대한 정보를 추가로 제공하고 있다고 볼 수 있다.
그래서 아래처럼 확인해봤다.
import org.springframework.data.domain.page
@SpringBootTest
class UserRepositoryTest{
@Autowired
private UserRepository userRepository;
@Test
void crudTest(){
Page<User> users = userRepository.findAll(PageRequest.of(0, 3));
System.out.println("page : " + users);
System.out.println("total elements : " + users.getTotalElements());
System.out.println("total Pages : " + users.getTotalPages());
System.out.println("number of Elements : " + users.getNumberOfElements());
System.out.println("sort : " + users.getSort());
System.out.println("size : " + users.getSize());
users.getContent().forEach(System.out::println);
}
데이터는 총 5개가 존재하고 3개씩 나눠 첫페이지인 0페이지를 users로 받았다.
그래서 users를 그대로 출력했을때 Page 1 of 2 처럼 첫번째 페이지라는 것을 볼 수 있다.
getTotalElement는 총 레코드 수를 가져오기 때문에 5를 출력하고있고
getTotalPages는 총 페이지수인 2를 출력한다.
getNumberOfElements는 현재 페이지의 레코드수를 가져온다. 그렇기 때문에 3을 출력.
getSort는 따로 sorting에 대해 명시하지 않았기 때문에 UNSORTED가 출력된다.
getSize는 가져오도록 요청한 레코드 수이기 때문에 3을 출력한다.
처음에 getNumberOfElements와 getSize값이 같다보니 내가 생각한게 맞나 싶었는데 다음 페이지 출력해보니까
제대로 알게 되었다. NumberOfElements는 가져오도록 요청한 페이지에서 담고 있는 레코드 수.
getSize는 PageRequest.of로 요청한 페이지당 레코드의 수이다.
그리고 데이터를 출력하는것은 getContent()를 통해 출력한다.
sort를 지정하게 되면 어떻게 출력되는지 보기 위해서 한번 더 테스트해봤다.
import org.springframework.data.domain.page
@SpringBootTest
class UserRepositoryTest{
@Autowired
private UserRepository userRepository;
@Test
void crudTest(){
Page<User> users = userRepository.findAll(PageRequest.of(0, 3, Sort.by("id").descending()));
System.out.println("sort : " + users.getSort());
users.getContent().forEach(System.out::println);
}
sort는 PageRequest.of().Sort..... 형태로 사용할줄 알았는데 아니었다.
size 뒤에 적어주면 된다.
결과값은 이렇게 출력.
좀 구분하기 쉽게 Long타입으로 되어있는 id로 정렬한건데 당연히 저 안에 다른 값을 넣어도 된다.
Reference
- 패스트캠퍼스 java/spring 초격차 패키지 Spring Data JPA
- Pagination Sort
[Spring Boot] Pagination과 Sort
1. 개요 Pagination은 큰 데이터를 표현할 때 도움이 됩니다. 또한 어떠한 기준으로 데이터를 정렬하며 페이징해야할 수 있습니다. 이번 튜토리얼은 Spring Data Jpa를 사용하여 페이징하는 방법에 대해
itmining.tistory.com
'Spring' 카테고리의 다른 글
JPA QueryMethod 1 (기본 키워드) (0) | 2022.02.14 |
---|---|
Jpa QueryByExampleExecutor 인터페이스 (0) | 2022.02.08 |
JPA JpaRepository 메소드 (count(), existsById~(), delete~()) (0) | 2022.01.31 |
JPA JpaRepository 메소드 (save(), find~()) (0) | 2022.01.28 |
JPA 기초 (0) | 2022.01.26 |