Quarydsl 로 no-offset 페이지네이션이 구현가능할까요?
[질문 내용]
여기에 질문 내용을 남겨주세요.
김영한님 로드맵중 실전로드맵 패키지 듣고있는데,
restapi설계중에 무한스크롤을 구현해야하는 시점에
강의 내용에 Quarydsl로 페이지네이션 강의가 나와서 여쭤봅니다
no-offset 방식으로 페이지네이션이 구현 가능할까요 ?
가능하다면 어떤식으로 구현해야할까요..
답변 1
4
안녕하세요. S-J L님, 공식 서포터즈 y2gcoder입니다.
no-offset 방식으로 페이지네이션이 구현 가능할까요 ?
에 대해 질문해주셨습니다. 일단 당연히 가능합니다. 제가 개발했던 프로젝트에서 no-offset 페이징 구현 코드를 간단한 코드로 변형해서 보여드리겠습니다.
@RequiredArgsConstructor
@Repository
public class PostQueryPepository {
private final JPAQueryFactory queryFactory;
...
public Slice<PostResponse> findPostsWithNoOffset(Long lastPostId, Pageable pageable) {
List<Post> fetch = queryFactory.selectFrom(post)
.where(getWhereLastPostIdLowerThan(lastPostId))
.orderBy(post.id.desc())
.limit(pageable.getPageSize() + 1)
.fetch();
List<PostResponse> content = fetch.stream()
.map(p -> new PostResponse(p))
.collect(Collectors.toList());
boolean hasNext = false;
if (content.size() > pageable.getPageSize()) {
content.remove(pageable.getPageSize());
hasNext = true;
}
return new SliceImpl<>(content, pageable, hasNext);
}
}
Spring Data JPA의 Slice 방식을 따라서 한 번에 조회해야 하는 데이터 개수 + 1만큼 조회한 뒤에 hasNext 값을 구했습니다. 한 번에 조회해야 하는 개수보다 더 많은 수를 조회해왔다면 다음 페이지가 있는 것이니 hasNext 값을 true로 바꾸고 마지막에 추가로 조회 해온 데이터를 삭제 하고 SliceImpl에 담아서 반환해주고 해당 반환 값을 적절한 DTO로 변경하여 응답해주었습니다. 첫 번째 조회가 아닌 N번째 조회 때는 lastPostId에 값이 들어올테니 where 조건문에서 lastPostId 보다 더 작은 id를 가진 post들을 기준으로 데이터들을 페이징하여 들고오도록 구현했습니다. 해당 방식으로 응답한 값을 앱(React Native)에서는 React Query의 useInfiniteQuery()를 사용해서 화면에 뿌려주었습니다.
이대로 똑같이 하라는 말씀은 절대 아닙니다. 단지 이렇게 구현할 수 있다는 것을 보여드리고자 했고, 아마 S-J L님께서는 더 깔끔한 방법으로 하실 수 있을 것 같습니다.
감사합니다.
SpringBoot 4.X에서의 Querydsl 설정
0
109
2
querydsl 오픈소스에 대한 질문
1
85
1
예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?
0
117
1
Querydsl 6.X버전에 대해서 어떻게 생각하시나요?
0
331
2
여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요
1
74
1
fetchResults()는 더이상 권장되지 않는다는데 맞나요?
0
164
1
querydsl sum() 메서드 없어요.
0
163
2
build 디렉터리 생성
0
142
2
자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?
0
117
2
현재 Querydsl에서 from절 서브쿼리를 지원하나요?
0
95
1
오타 제보 드립니다.
0
74
2
벌크 연산과 flush, clear
0
78
1
Run As Intellij 로 변경시 Q타입 import 불가
0
90
1
QHello import하기 문제 발생
0
150
2
등록된 함수 보는법(H2Dialect) 질문
0
71
2
5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의
1
201
2
[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??
1
204
1
querydsl 설정 문제
0
223
2
quey dsl 설정부분
0
159
2
count 쿼리 관련 질문입니다!
0
75
1
stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.
0
90
1
답변부탁드리겠습니다.
0
92
2
(OrderSpecifier)관련 내용 어디있을가요
0
67
1
중급문법 벌크연산에서
0
84
2





