1. 페이징/정렬 처리하기
- JPA가 실제 데이터베이스에서 사용하는 SQL의 처리를 자동으로 하기 때문에 개발자들은 SQL이 아닌 ‘API의 객체와 메서드를 사용하는 형태’로 페이징 처리를 할 수 있게 됨.
- Spring Data JPA에서 페이징 처리와 정렬은
findAll()
메서드를 사용함.*
findAll()
:PagingAndSortRepository
인터페이스의 메서드. - Interface PagingAndSortingRepository<T,ID>
2. Pageable 인터페이스
1) Pageable
인터페이스
- 페이지 처리에 필요한 정보를 전달하는 용도의 타입으로, 인터페이스이기 때문에 실제 객체를 사용할 때는 구현체인
PageRequest
라는 클래스를 사용.
2) PageRequest
클래스
PageRequest
클래스의 생성자는protected
로 선언되어new
를 이용할 수 없음.
⇒ 객체를 생성하기 위해 static한of()
를 사용.
🔗 [Link] Class PageRequest Reference
*
of()
의 형태
of(int page, int size)
: 0부터 시작하는 페이지 번호와 개수(size)of(int page, int size, Sort sort)
: 페이지 번호와 개수, 정렬 관련 정보
3. 페이징 처리
- Spring Data JPA를 이용할 때 페이지 처리는 반드시 0부터 시작.
1) 페이징 쿼리
1
2
3
4
5
6
7
8
9
10
@Test
public void testPageDefault() {
//1페이지 10개
Pageable pageable = PageRequest.of(0,10);
Page<Memo> result = memoRepository.findAll(pageable);
System.out.println(result);
}
- 첫 번째 쿼리 : 페이징 처리에 사용되는
limit
구문 사용됨. - 두 번째 쿼리 :
count()
를 이용해 전체 개수를 처리.
⇒findAll()
에Pageable
타입의 파라미터를 전달하면 페이징 처리에 관련된 쿼리들을 실행하고, 이 결과들을 이용해 리턴 타입으로 지정된Page<엔티티 타입>
객체로 저장함.
2) Page<엔티티 타입>의 메서드
1
2
3
4
5
6
7
8
System.out.println(result);
System.out.println("----------------------------------");
System.out.println("Total Pages: " + result.getTotalPages()); //총 몇 페이지
System.out.println("Total Count: " + result.getTotalElements()); //전체 개수
System.out.println("Page Number : " + result.getNumber()); //현재 페이지 번호. 0부터 시작.
System.out.println("Page Size : " + result.getSize()); //페이지당 데이터 개수
System.out.println("has next page? : " + result.hasNext()); //다음 페이지 존재 여부
System.out.println("first page? : " + result.isFirst()); //시작 페이지(0) 존재 여부
3) 실제 페이지의 데이터 처리
1
2
3
for(Memo memo : result.getContent()) {
System.out.println(memo);
}
4. 정렬 조건 추가
1) 테스트 1
1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testSort() {
Sort sort1 = Sort.by("mno").descending();
Pageable pageable = PageRequest.of(0, 10, sort1);
Page<Memo> result = memoRepository.findAll(pageable);
result.get().forEach(memo -> {
System.out.println(memo);
});
}
쿼리
- 페이징 처리만 했을 때의 쿼리와 비교했을 때
order by
구문이 추가된 것을 알 수 있음.