JAVA

[JAVA] Spring data JPA 페이징과 정렬

응디 2022. 2. 17. 17:53

페이징과 정렬 파라미터

Sort : 정렬 기능

Pageable : 페이징 기능( 내부 Sort 포함 )

 

 

특별한 반환 타입

1. Page : 추가 count 쿼리 결과를 포함하는 페이징

→ 일반적인 페이징

 

2. Slice : 추가 count 쿼리 없이 다음 페이지만 확인가능

→ 스크롤 내리다 더보기 버튼 생성 하는 페이징

 

3. List : 추가 count 쿼리 없이 결과만 반환한다.

 

※ 여기서 count는 total count를 의미

 

Page<Member> findByAge(int age, Pageable pageable);

 

 

<test code>

@Test
    public void paging() 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));

        int age = 10;
        PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
        
        // Slice 는 total count를 하지 않음 -> 더보기 버튼을 위해 3개를 보여주려면 4개를 가져와서 하나를 더보기 버튼으로 보여줌
        // Slice<Member> page = memberRepository.findByAge(age, pageRequest);
        Page<Member> page = memberRepository.findByAge(age, pageRequest);
        
        // page를 저 위에 대로 반환하면 큰일난다. 
		// controller에서 entity를 노출시키면 안된다. 
		// entity는 애플리케이션 내에서만 간직 -> dto로 변경해서 반환해야함
        Page<MemberDto> toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));

        //then
        List<Member> content = page.getContent();
        long totalElements = page.getTotalElements();   // total count

        assertThat(content.size()).isEqualTo(3);    // 한페이지 게시글 개수
        assertThat(page.getTotalElements()).isEqualTo(5);   // 총 게시글 수
        assertThat(page.getNumber()).isEqualTo(0);      // 페이지 번호 
        assertThat(page.getTotalPages()).isEqualTo(2);  // 전체 페이지 개수 (5개를 3개씩 나누니까 페이지 2개)
        assertThat(page.isFirst()).isTrue();            // 첫번째 페이지 인가?
        assertThat(page.hasNext()).isTrue();            // 다음 페이지가 있나?


    }

 

@Query를 사용해서 page 를 구현 할 때 join이 이루어지면 total count 쿼리도 join 해서 불러오기 때문에 성능이 저하될 수 있다.

→ 쿼리가 복잡해 질 수록 total count는 간단하게 불러 올 수있도록 따로 쿼리를 만들어줘야함!(아래 예시)

@Query(value="select m from Member m left join m.team t",
            countQuery="select count(m) from Member m") // 쿼리가 복잡해지면 total count를 구하는 쿼리를 따로 만들어줘야한다.
Page<Member> findByAge(int age, Pageable pageable);

 

 

참고사항

  • page는 0부터 시작한다.
  • controller에서는 entity 로 반환하면 안되다! → entity는 노출 금지 (Dto로 반환해줘야함)

'JAVA' 카테고리의 다른 글

[JAVA] Auditing  (0) 2022.02.24
[JAVA] 벌크성 수정 쿼리와 @EntityGraph  (0) 2022.02.23
[JAVA] return type(Optional)  (0) 2022.02.16
[JAVA] @Query에서 DTO로 조회하기  (0) 2022.02.15
[JAVA] @NamedQuery 와 @Query  (0) 2022.02.15