1. 페이징/정렬 처리하기

  • JPA가 실제 데이터베이스에서 사용하는 SQL의 처리를 자동으로 하기 때문에 개발자들은 SQL이 아닌 ‘API의 객체와 메서드를 사용하는 형태’로 페이징 처리를 할 수 있게 됨.
  • Spring Data JPA에서 페이징 처리와 정렬은 findAll() 메서드를 사용함.

    findAll() :

    PagingAndSortRepository 인터페이스의 메서드.

  • Interface PagingAndSortingRepository<T,ID>
    image

2. Pageable 인터페이스

1) Pageable 인터페이스

  • 페이지 처리에 필요한 정보를 전달하는 용도의 타입으로, 인터페이스이기 때문에 실제 객체를 사용할 때는 구현체인 PageRequest라는 클래스를 사용.

2) PageRequest 클래스

  • PageRequest 클래스의 생성자는 protected로 선언되어 new를 이용할 수 없음.
    ⇒ 객체를 생성하기 위해 static한 of()를 사용.

image

image 🔗 [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);

}

image

  • 첫 번째 쿼리 : 페이징 처리에 사용되는 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) 존재 여부

image

3) 실제 페이지의 데이터 처리

1
2
3
for(Memo memo : result.getContent()) {
    System.out.println(memo);
}

image

4. 정렬 조건 추가

  • Sort클래스도 protected로 선언되어 있으므로, 객체 생성하기 위해 접근제한자가 staticby()를 이용.
    image

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);
    });
}

쿼리

image

  • 페이징 처리만 했을 때의 쿼리와 비교했을 때 order by구문이 추가된 것을 알 수 있음.

실행 결과(역순 정렬)

image

2) 테스트 2

  • 정렬 조건은 Sort객체의 and()를 이용해 여러 개의 정렬 조건을 다르게 지정할 수 있음.

    1
    2
    3
    4
    5
    6
    7
    8
    
      @Test
      public void testSort() {
          Sort sort1 = Sort.by("mno").descending();
          Sort sort2 = Sort.by("memoText").ascending();
          Sort sortAll = sort1.and(sort2);    //and를 이용한 연결
    
          Pageable pageable = PageRequest.of(0, 10, sortAll);
      }
    

    image