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);
});
}
}
실행쿼리
정렬 결과
'Back-End > Spring' 카테고리의 다른 글
[spring boot] 간단한 방명록 만들기 [2편] (0) | 2022.06.16 |
---|---|
[spring boot] @Query 어노테이션 (0) | 2022.06.14 |
[spring boot] JPA로 CRUD 테스트 (0) | 2022.06.10 |
[Spring boot] JPA & MariaDB 테이블생성 (0) | 2022.06.10 |
[spring boot] 간단한 방명록 만들기 [1편] (0) | 2022.05.20 |