본문 바로가기
Back-End/Spring

[spring boot] JPA 페이징/정렬 처리

by LeeGangEun 2022. 6. 14.

JPA의 페이징 처리

  • JPA는 개발자들이 SQL이 아닌 API의 객체와 메서드를 사용하는 형태로 페이징 처리를 할 수 있다.
  • 페이징 처리할때 사용하는 메소드는 findAll() 이다.
  • findAll()메소드는 ]paRepository 인터페이스의 상위인 PagingAndSortRepository의 메서드로
    파라미터로 전달되는 Pageable이라는 타입의 객체에 의해서 실행되는 쿼리를 결정하게 된다.


Pageable 인터페이스

  • Pageable 인터페이스는 페이지 처리에 필요한 정보를 전달하는 용도의 타입으로
    인터페이스이기 때문에 실제 객체를 생성할 때는 구현체인 PageRequest라는 클래스를 사용한다.
  • PageRequest 클래스의 생성자는 protected로 선언되어 new를 사용할수 없고,
    객체를 생성하기 위해서는 static한 of()를 이용해 처리한다.

페이징 테스트

@SpringBootTest
public class MemoRepositoryTests {
    @Autowired // 주입 @Inject가 표준임
    MemoRepository memoRepository;  //memoRepository 객체가 자동 생성됨

@Test
    public void testPageDefault(){
        // 1페이지 10개
        Pageable pageable = PageRequest.of(0,10);
        Page<Memo> result = memoRepository.findAll(pageable);
        System.out.println(result);
        System.out.println("--------------------");
        System.out.println("전체 페이지수 :" +result.getTotalPages()); // 총 몇페이지
        System.out.println("전체글수 :" +result.getTotalElements()); // 전체 개수
        System.out.println("현재 페이지 번호" + result.getNumber()); // 현재 페이지 번호 0부터 시작
        System.out.println("페이지당 글수" + result.getSize()); // 페이지당 데이터 개수
        System.out.println("다음 페이지 존재여부" + result.hasNext()); // 다음 페이지 존재 여부
        System.out.println("현재페이지가 시작페이지인지 여부" + result.isFirst()); // 시작 페이지(0) 여부
        System.out.println("----------------------");
        for(Memo memo : result.getContent()){
            System.out.println(memo);
        }
    }
}

아래 코드에서 주의 깊게 볼 부문중 하나는 리턴타입이 Page라는 점이다.
=> Page타입은 단순히 해당 목록만으로 가져오는데 그치지 않고
실제 페이지 처리에 필요한 전체 데이터의 개수를 가져오는 쿼리도 같이 처리하기 때문이다.

실제 페이지 데이터를 처리하는 것은 getContent()를 이용해서 List<엔티티 타입>으로 처리하거나,
Stream<엔티티 타입>을 반환하는 get()을 이용할 수 있다.

실행쿼리

정렬 테스트

@SpringBootTest
public class MemoRepositoryTests {
    @Autowired // 주입 @Inject가 표준임
    MemoRepository memoRepository;  //memoRepository 객체가 자동 생성됨
    
    @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); 
        // => 결합된 정렬 조건 사용
        // => 0부터 시작하는 페이지 번호와, 개수, 정렬 기준
        
        Page<Memo> result = memoRepository.findAll(pageable);
        result.get().forEach(memo ->{
            System.out.println(memo);
        });
    }
}

실행쿼리

정렬 결과