Spring Data JPA) 페이징과 정렬

Dokuny·2022년 1월 5일
0

JPA 의 페이징

JPA는 페이징을 두 API로 추상화 해두었다.

public List<Member> findByPage(int age,int offset,int limit){
	return em.createQuery("select m from Member m where m.age = :age order by m.username desc",Member.class)
    			.setParameter("age",age)
                	.setFirstResult(offset)
                    	.setMaxResults(limit)
                        .getResultList();
}
  • setFirstResult(int startPosition) : 조회를 시작할 위치를 정한다.
  • setMaxResults(int maxResult) : 조회할 데이터 수를 정한다.

Spring Data JPA의 페이징

Spring Data JPA는 페이징과 정렬 파라미터 및 특별한 반환 타입이 존재한다.

  • 페이징정렬 파라미터
    • org.springframework.data.domain.Sort : 정렬 기능
    • org.springframework.data.domain.Pageable : 페이징 기능(내부에 Sort 포함)

  • 반환 타입
    • org.springframework.data.domain.Page : count 쿼리 결과를 포함하는 페이징
    • org.springframework.data.domain.Slice : count 쿼리없이 다음페이지만 확인 (limit에서 +1만큼 더 조회)
    • List : 자바컬렉션, 결과만을 반환

Repository에서의 예시

Page<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용
Slice<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안함 
List<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안함
List<Member> findByUsername(String name, Sort sort);
  • Pageable은 인터페이스로 실제 사용 시에는 해당 인터페이스를 구현한 org.springframework.data.domain.PageRequest 를 사용한다.

사용 예시

PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
Page<Member> page = memberRepository.findByAge(10, pageRequest);
  • PageRequest.of(int page,int size,Sort sort)
    • page : 현재 페이지 설정, 0번부터 시작
    • size : 조회할 데이터 수
    • sort : 정렬 정보

Page 인터페이스

// Page는 Slice를 상속 받고 있다.
public interface Page<T> extends Slice<T> { 
	int getTotalPages();//전체 페이지 수
	long getTotalElements(); //전체 데이터 수 
    	<U> Page<U> map(Function<? super T, ? extends U> converter); //변환기
}

Slice 인터페이스

public interface Slice<T> extends Streamable<T> { 
	int getNumber(); //현재 페이지
    	int getSize(); //페이지 크기
	int getNumberOfElements(); //현재 페이지에 나올 데이터 수 
	List<T> getContent(); //조회된 데이터
   	boolean hasContent(); //조회된 데이터 존재 여부
   	Sort getSort();	//정렬 정보
	boolean isFirst(); //현재 페이지가 첫 페이지 인지 여부
   	boolean isLast(); //현재 페이지가 마지막 페이지 인지 여부
   	boolean hasNext(); //다음 페이지 여부
	boolean hasPrevious();  //이전 페이지 여부
   	Pageable getPageable(); //페이지 요청 정보
    	Pageable nextPageable();//다음 페이지 객체
	Pageable previousPageable();//이전 페이지 객체 
   	<U> Slice<U> map(Function<? super T, ? extends U> converter); //변환기
}
profile
모든 것은 직접 경험해보고 테스트하자

0개의 댓글