[Spring Data JPA] 페이지네이션
게시판을 생각해보자. 정말 수많은 데이터가 있을 것이다. 매번 이 모든 데이터를 호출하기는 성능적으로 가능할 수가 없다. 그래서 우리는 페이지에 맞게 일정 수에 해당하는 데이터만 가져온다. 그게 페이징이다.
이 페이징을 JPA로 어떻게 하는지 보고, 그것을 Spring Data JPA에서 얼마나 더 간단히 하는지 보자.
Pageable
@GetMapping("page")
public String Page(Pageable pageable){
''' 코드'''
}
먼저 컨트롤러에서 Pageable 인터페이스 타입을 파라미터로 받으면 된다.
Pageable 인터페이스를 보자.
밑을 더 내려보면 getPageNumber(); getPageSize(); 와 같이 페이징에 관련된 기능과 정렬을 위한 기능들이 추상화되어 있다.
우리는 Repository에서 이러한 파라미터로 받은 Pageable을 이용하여 페이징을 하는 쿼리문을 사용하면 된다.
잠깐 pageable 클래스의 상속 구조를 보자.
실제 메서드 호출을 할때는 Pageable을 상속받고 있는 PageRequest를 사용하면 된다.
PageRequest의 생성자를 보면 들어가야할 요소들이 나와있다.
size : 한 페이지당 담길 데이터의 양 ex) 10, 5, ...
page : size를 기준으로 몇번째 페이지인지? ex) 0, 1, ...
sort : 무엇을 기준으로 정렬할 것인지? ex) createdAt,DESC, description
In Repository
@Query(value = "select m from Member m left join m.team t",
countQuery = "select count(m) from Member m")
Page<Member> findByAge(int age, Pageable pageable);
JpaRepository를 상속받는 레포지토리 인터페이스에 해당 코드를 넣자.
해당 코드는 Member 엔티티를 Page의 형식으로 리턴해준다. 파라미터로 age와 pageable을 받고 있다.
단순히 리턴타입을 page로, 파라미터로 pageable을 넣어 줬을 뿐인데, 우리는 페이지네이션을 성공시킬 수 있다.
Use in Test
@Test
public void page() throws Exception{
//given
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 10));
memberRepository.save(new Member("member3", 10));
memberRepository.save(new Member("member4", 10));
memberRepository.save(new Member("member5", 10));
memberRepository.save(new Member("member6", 10));
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
int age = 10;
//when
Slice<Member> page = memberRepository.findByAge(age, pageRequest);
//then
List<Member> content = page.getContent();
assertThat(content.size()).isEqualTo(3); //조회된 데이터 수
assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
assertThat(page.isFirst()).isTrue(); //첫번째 항목인가?
assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는가?
}
pageRequest.of(0, 3, Sort.bhy(Sort.Direction.DESC, "username"))
pageRequest의 생성자를 봐쎘지만 이렇게 되면, 3개씩 데이터를 가져오는데 그중에 0번째 페이지를 의미하고, username 기준으로 내림차순 정렬을 할 것이란 말이다.
테스트는 쉽게 통과~