JPA는 개발자들이 SQL이 아닌 API의 객체와 메서드를 사용하는 형태로 페이징 처리를 할 수 있도록 도와줍니다.
페이징 처리를 위한 가장 중요한 것은 org.springframeword.data.domin.Pageable인터페이스 입니다.
아래 코드에서 주의 깊게 볼 부문중 하나는 리턴타입이 Page라는 점입니다.
import com.example.entity.Memo;
import com.example.repository.MemoRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemoRepository memoRepository;
@Test
public void testPageDefault(){
// 1페이지 10개
Pageable pageable = PageRequest.of(0,10);
Page<Memo> result = memoRepository.findAll(pageable);
System.out.println(result);
}
}
findAll()에 Pageable타입의 파라미터를 전달하면 페이징 처리에 관련된 쿼리들을 실행하고, 이결과들을 이용해 리턴타입으로 지정된 Page<엔티티타입>객체로 저장합니다.
Hibernate:
select
memo0_.mno as mno1_0_,
memo0_.memo_text as memo_tex2_0_
from
// limit : MySql에서 페이징 처리에 사용하는 limit구문
tbl_memo memo0_ limit ?
Hibernate:
select
// count() : 전체 개수를 처리한다
count(memo0_.mno) as col_0_0_
from
tbl_memo memo0_
Page 1 of 10 containing com.example.entity.Memo instances
페이징 처리를 담당하는 PageRequest에는 정렬과 관련된 Sort타입을 파라미터로 전달할 수 있습니다.
import com.example.entity.Memo;
import com.example.repository.MemoRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemoRepository memoRepository;
@Test
public void testPageDefault(){
// 정렬
Sort sort = Sort.by("mno").descending();
Sort sort2 = Sort.by("memoText").ascending();
Sort sortAll = sort.and(sort2); // and를 이용한 연결
// 1페이지 10개
Pageable pageable = PageRequest.of(0,10,sort);
Pageable pageable2 = PageRequest.of(0,10,sortAll);
Page<Memo> result = memoRepository.findAll(pageable);
Page<Memo> result2 = memoRepository.findAll(pageable2);
System.out.println(result);
result.get().forEach(memo -> {
System.out.println(memo);
});
System.out.println(result2);
result2.get().forEach(memo -> {
System.out.println(memo);
});
}
}
Hibernate:
select
memo0_.mno as mno1_0_,
memo0_.memo_text as memo_tex2_0_
from
tbl_memo memo0_
order by
memo0_.mno desc limit ?
Hibernate:
select
count(memo0_.mno) as col_0_0_
from
tbl_memo memo0_
Page 1 of 10 containing com.example.entity.Memo instances
---------------------------------------------------------------
// and 사용한 쿼리
Hibernate:
select
memo0_.mno as mno1_0_,
memo0_.memo_text as memo_tex2_0_
from
tbl_memo memo0_
order by
memo0_.mno desc,
memo0_.memo_text asc limit ?
Hibernate:
select
count(memo0_.mno) as col_0_0_
from
tbl_memo memo0_
Page 1 of 10 containing com.example.entity.Memo instances
Memo(mno=100, memoText=Memo...100)
Memo(mno=99, memoText=Memo...99)
Memo(mno=98, memoText=Memo...98)
Memo(mno=97, memoText=Memo...97)
Memo(mno=96, memoText=Memo...96)
Memo(mno=95, memoText=Memo...95)
Memo(mno=94, memoText=Memo...94)
Memo(mno=93, memoText=Memo...93)
Memo(mno=92, memoText=Memo...92)
Memo(mno=91, memoText=Memo...91)