스프링 data jpa 페이징

스프링 data jpa 페이징

728x90

인터페이스 구현

import com.study.datajpa.dto.MemberDto; import com.study.datajpa.entity.Member; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.Collection; import java.util.List; public interface MemberRepository extends JpaRepository { // @Query(value = "select m from Member m left join m.team t", // countQuery = "select count(m) from Member m") // 실무에서는 countQuery를 작성해 성능 최적화 필요할수도 있음 Page findByAge(int age, Pageable pageable); // Page는 토탈카운트를 가져와 성능 부하 걸릴 수 있음, Slice는 가져오는 엘리먼트 + 1로 페이징 기능 구현현 // Slice findByAge(int age, Pageable pageable); }

테스트케이스

@Test public void paging(){ 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)); int age = 10; // 0 은 page number , 3 은 count PageRequest pageRequest = PageRequest.of(0, 3, Sort.Direction.DESC, "username"); // Total페이지를 가지고오면 성능에 부담이가는 경우 (요청 size에서 +1 한 만큼 가져와서 값이 있으면 True, 없으면 False) total count 안 가지고 옴 // 인터페이스도 Slice로 리턴해줘야함 // Slice page = memberRepository.findByAge(age, pageRequest); // 리스트로도 받을 수 있음. 대신 pageing함수 사용 불가 Page page = memberRepository.findByAge(age, pageRequest); // dto로 반환 Page toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null)); List content = page.getContent(); // 갖고온 사이즈 assertThat(content.size()).isEqualTo(3); // 총 엘리먼트 개수 // Slice 사용하면 사용 못함 assertThat(page.getTotalElements()).isEqualTo(5); // 페이지 번호 assertThat(page.getNumber()).isEqualTo(0); //전체 페이지 개수 // Slice 사용하면 사용 못함 assertThat(page.getTotalPages()).isEqualTo(2); // 첫벗째 페이지이인가? assertThat(page.isFirst()).isTrue(); // 다음페이지가 있나? assertThat(page.hasNext()).isTrue(); }

728x90

from http://arch1tect.tistory.com/198 by ccl(A) rewrite - 2021-10-23 00:27:30