앱잼 중 앱 커뮤니티 프로덕트에 참여하게 되었다. 커뮤니티 특성 상 전체조회가 되는 API가 있었고 기존에 사용하던 전체 조회 방식은 한번에 모든 데이터에 관한 정보가 전송되어서 서버에 부하가 심해진다고 판단하였다! 그래서 한번에 전송하지 않고 데이터를 끊어서 보내는 pagination을 사용하게 되었고 Offset기반 방식의 문제점과 프로덕트 특성 상 무한 스크롤을 구현해야 하기 때문에 cursor기반 페이지네이션이 적합하다고 판단하여 cursor기반으로 진행하였다!
Pagination에 대해 따로 정리할 예정입니다. 다음 아티클을 참고 해주세요! To be continued..
페이지네이션을 구현하기 위해 사용하는 개념 및 인터페이스를 먼저 알아보겠습니다~!
Cursor
사용자에게 응답해준 마지막의 데이터의 식별자 값
Limit
사용자에게 한번에 전달할 데이터 개수
Page<T>
페이지 정보를 담게 되는 인터페이스
public interface Page<T> extends Slice<T> {
int getTotalPages();// 전체 페이지 개수
long getTotalElements();// 전체 요소 개수
<U> Page<U> map(Function<? super T, ? extends U> converter); // 변환기
}
Pageable
페이지 처리에 필요한 정보를 담게 되는 인터페이스
public interface Pageable {
int getPageNumber();
int getPageSize();
long getOffset();
Sort getSort();
Pageable next();
Pageable previousOrFirst();
Pageable first();
Pageable withPage(int pageNumber);
boolean hasPrevious();
}
PageRequest 클래스
: Spring Data JPA에서 제공하는 Pageable
구현체
page
: 조회할 페이지 번호(0부터 시작)size
: 한 페이지당 최대 항목 수sort
: 정렬 정보(생략 가능)direction
: 정렬 방향(ASC, DESC)properties
: 정렬 대상 속성명Slice
특정 데이터베이스 조회 등의 작업을 수행하고 그 결과를 반환하는 데 사용되는 객체
public interface Slice<T> extends Streamable<T> {
int getNumber(); // 현재 페이지
int getSize(); // 페이지 크기
int getNumberOfelements(); // 현재 페이지에 나올 데이터 수
List<T> getContent(); // 조회된 데이터
boolean hasContent(); // 조회된 데이터 존재 여부
Sort getSort(); // 정렬 정보
boolean isFirst(); // 현재 페이지가 첫 번째 페이지인지 여부
boolean isLast(); // 현재 페이지가 마지막 페이지인지 여부
boolean hasNext(); // 다음 페이지 여부
boolean hasPrevious(); // 이전 페이지 여부
Pageable getPageable(); // 페이지 요청 정보
Pageable nextPageable(); // 다음 페이지 객체
Pageable previousPageable(); // 이전 페이지 객체
<U> Slice<U> map(Function<? super T, ? extends U> convert); // 변환기
}
'3.2.1'
게시물에 해당하는 답글 전체 조회를 Cusor기반 페이지네이션을 적용해서 구현해보겠습니다
controller
- CommentController.java
service
- CommentQueryService클래스 안의 getCommentAll메소드
pageRequest
: 페이지네이션 구현을 위해 PageRequest
객체를 생성해줍니다!Page
객체를 반환해주기 때문입니다.commentList
를 선언해줍니다.if문
else 문
return값
repository
DTO
커서 기반 페이지네이션을 구현해보았는데요..!! 처음에 그냥 페이지네이션을 해야한다고 하다가 고생했었는데 구현에 앞서 page
, slice
, pageRequest
등등 관련 개념을 먼저 공부하고 진행하면 더욱 정확하게 이해할 수 있을 것 같습니다~!