본문 바로가기
백엔드/JPA

스프링 data jpa 페이징

by 김어찐 2021. 10. 23.
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<Member, Long> {



//    @Query(value = "select m from Member m left join m.team t",
//            countQuery = "select count(m) from Member m")
//    실무에서는 countQuery를 작성해 성능 최적화 필요할수도 있음
    Page<Member> findByAge(int age, Pageable pageable);

//  Page는 토탈카운트를 가져와 성능 부하 걸릴 수 있음, Slice는 가져오는 엘리먼트 + 1로 페이징 기능 구현현
//   Slice<Member> 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<Member> page = memberRepository.findByAge(age, pageRequest);
//        리스트로도 받을 수 있음. 대신 pageing함수 사용 불가
        Page<Member> page = memberRepository.findByAge(age, pageRequest);

        // dto로 반환
        Page<MemberDto> toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));


        List<Member> 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

'백엔드 > JPA' 카테고리의 다른 글

스프링 데이터 jpa 패치조인 @EntityGraph  (0) 2021.10.23
스프링 데이터 jpa 벌크 쿼리  (0) 2021.10.23
스프링 데이터 JPA 복잡한 정적 쿼리 @Query  (0) 2021.10.22
스프링 데이터 JPA 기초  (0) 2021.10.22
JPA 조인  (0) 2021.10.19