웹(Web)/백엔드(Backend)

Spring Data JPA 페이징

SK_MOUSE 2022. 9. 1. 00:52
반응형

Spring Data JPA 에서 페이징 및 슬라이스에 대해 알아보겠다.

Spring Data JPA 페이징

Paging(페이징)

페이징을 하기 위한 메소드는 아래와 같이 구성한다.

public interface MemberRepository extends Repository<Member, Long> {
 Page<Member> findByAge(int age, Pageable pageable);
}

 

data : 5, offset : 3 으로 나누는것을 아래처럼 보여준다.

@Test
public void page() throws Exception {
         //5개의 데이터 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));
         
         //when : PageRequest를 인자로 보통 넘겨준다.
         PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC,
        "username"));
         Page<Member> page = memberRepository.findByAge(10, pageRequest);
         //then
         List<Member> content = page.getContent(); //조회된 데이터
         assertThat(content.size()).isEqualTo(3); //조회된 데이터 수
         assertThat(page.getTotalElements()).isEqualTo(5); //전체 데이터 수
         assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
         assertThat(page.getTotalPages()).isEqualTo(2); //전체 페이지 번호
         assertThat(page.isFirst()).isTrue(); //첫번째 항목인가?
         assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는가?
}

 

 


위에서 JPA 활용2에서 말한 내용처럼

엔티티를 그대로 노출(반환)해서는 안된다!

@Test
public void page() throws Exception {
    /*
    중략
    */
 	Page<Member> page = memberRepository.findByAge(10, pageRequest);
 	
  	 //아래와 같이 Dto에 감싸서 반환해야함.
 	Page<MemberDto> toMap = page.map(m -> new MemberDto(m.getId(), m.getUsername(), m.getTeam());
 }

아래와 같이 Member를 그대로 Page로 반환하는게 아니라 MemberDto로 변경해서 보내야함.

반응형