JPA에서는 실제 DB에서 사용하는 SQL의 처리를 자동으로 하기 때문에 우리는 SQL이 아닌 API의 객체와 메서드를 사용하는 형태로 페이징 처리를 할 수 있다.
처음 Spring Initializr에서 프로젝트 생성할때 dependency에서 Spring Data JPA를 사용할 경우
1) Pageable 인터페이스
2) 실제 객체를 생성할때는 구현체인 org.springframework.data.domain.PageReqeust
클래스를 사용할 수 있다.
이때 PageRequest 클래스의 생성자는 .of( )
메서드 및 내부의 page
, size
, Sort 정보
를 이용해서 객체를 생성한다.
.of(int page, int size)
: 0부터 시작하는 페이지 번호, 개수
.of(int page, int size, Sort.Direction direction, String ... props)
: 0부터 시작하는 페이지 번호, 개수, 정렬 방향, 정렬 기준 필드
.of(int page, int size, Sort sort)
: 페이지 번호, 개수, 정렬 정보
Pageable pageable = PageRequest.of(0, 10);
Page<Memo> result = memoRepository.findAll(pageable);
for(Memo memo : result.getContent()) {
System.out.println(memo);
}
--> findAll( ) 메서드에 pageable 파라미터를 전달하면 페이지 관련 쿼리를 실행하고 이 결과를 반환 타입으로 지정된 Page<entity>
객체로 저장한다.
이때 실제 페이지의 데이터를 처리하려면 List<entity>
를 반환하는 .getContent( )
메서드를 사용하거나 Stream<entity>
을 반환하는 .get( )
메서드를 사용한다.
Sort sort1 = Sort.by("mno").descending(); // PK인 mno를 역순(desc)으로 정렬
Sort sort2 = Sort.by("memoText").ascending(); // memoText 컬럼을 순차적(asc)로 정렬
Sort sortAll = sort1.and(sort2);
Pageable pageable = PageRequest.of(0, 10, sortAll);
Page<Memo> result = memoRepository.findAll(pageable);
result.get().forEach(memo -> {
System.out.println(memo);
});
--> PageReqeust
클래스는 정렬과 관련된 org.springframework.data.domain.Sort 타입을 파라미터로 전달할 수 있다.
이를 이용해서 페이징 처리를 통해 출력된 결과를 .descending( )
메서드로 역순(desc)으로 정렬하거나 .ascending( )
메서드로 순차적(asc)으로 정렬 시킬수 있다.
출처
- 코드로 배우는 스프링부트 웹프로젝트 (책)