findByPage
:페이징
을 하기 위한offset
과limit
을 받고,정렬
하기 위한필드
인age
를 받아페이징 수행
totalCount
: 보통페이징
을 하면서전체 데이터의 수
를 많이 쓰기 때문에 거의함께 필요함
실제 페이징
을 하면서다양한 정보
들이필요
현재 페이지
에 대한정보
마지막 페이지
정보최초 페이지
정보전체 데이터 수
- 등등
org.springframework.data
:JPA
에종속적이지 않고
다양한DB
와도호환 가능
한공통 인터페이스 부분
사용
하는페이징
과정렬
파라미터
:페이징을 하기 위한 정보
를Pageable객체
에 담아서 받게 된다
org.springframework.data
.domain
.Sort
:정렬
org.springframework.data
.domain
.Pageable
:페이징
(내부
에Sort 포함
)
제공
하는특별한 반환 타입
org.springframework.data
.domain
.Page
:추가 count 쿼리
결과를포함
하는페이징
org.springframework.data
.domain
.Slice
:추가 count 쿼리
없이다음 페이지만 확인 가능
한페이징
List<>
: 일반적인 컬렉션 List
Page<Member>
를 반환하며age
와Pageable 객체
를파라미터
로 지정
PageRequest
에페이징
에 필요한offset / limit / sort
를지정
하여파라미터로 전달
(PageRequest
는Pageable
의구현체
)
page.getTotalElements()
: 전체 데이터 수(count)
page.getNumber()
:현재 페이지
번호page.getTotalPages()
:전체 페이지
번호page.isFirst()
:첫 페이지
인지확인
page.hasNext()
:다음 페이지가 있는지
확인
Page
객체를 통한조회
시자동
으로전체 데이터 수 count를 구하는 쿼리
가생성
된다
[ Count Query 최적화 ]
Page 반환타입
을지정
할 경우자동으로 추가 count 쿼리가 발생
되는데 이 때문에성능이 느려질 수 있다는 것
을알아둘 필요
가 있다- 만약
Team
의 정보도함께 조회
하는 상황이라면join을 통한 쿼리가 실행
되어야 하는데
이 때,묵시적
으로count query
도join이 발생
되는 것을 확인할 수 있다
(count 쿼리
에서는해당하는 member의 수
만 알면 되서join이 불필요
하다!)
count query
를직접 지정
하면 이러한성능 악화
를 막을 수 있다
(count query 작성시
반드시반환타입이 Long
이라서count()
를 해주는 것을 잊지 말자)
- 반환타입을
Slice<>
로 명시하면Page<>
와 다르게추가 count쿼리가
나가지 않는다
- 대신 특별하게
우리가 조회하는 limit+1
만큼조회를 수행
offset 0
/limit 3
으로조회
했지만실제
로는limit+1만큼 조회
가 수행더보기 버튼
처럼다음 페이지의 부분 정보를 활용하는 페이징 방식
에서사용
됨추가 count를 구하는 쿼리
가수행되지 않기 때문에
해당 메서드는존재하지 않음
page.getTotalElements()
:데이터의 총 개수
page.getTotalPages()
:페이지의 총 개수
Page
/Slice
어느것을 쓰더라도결과적으로 Entity 자체를 반환하면 안된다
Page<>
/Slice<>
를그대로 DTO로 변환
한 뒤반환
하면 문제가 되지 않는다. (.map()
사용)