inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

Querydsl 지원 클래스 직접 만들기

Quarydsl 로 no-offset 페이지네이션이 구현가능할까요?

해결된 질문

1471

S-J L

작성한 질문수 13

0


[질문 내용]
여기에 질문 내용을 남겨주세요.

김영한님 로드맵중 실전로드맵 패키지 듣고있는데,

restapi설계중에 무한스크롤을 구현해야하는 시점에

강의 내용에 Quarydsl로 페이지네이션 강의가 나와서 여쭤봅니다

no-offset 방식으로 페이지네이션이 구현 가능할까요 ?

 

가능하다면 어떤식으로 구현해야할까요..

JPA java

답변 1

4

y2gcoder

안녕하세요. 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님께서는 더 깔끔한 방법으로 하실 수 있을 것 같습니다.


감사합니다.

0

S-J L

대충 흐름만 봐도 정성이 느껴집니다 감사합니다

0

y2gcoder

도움이 되셨으면 좋겠습니다. 감사합니다!

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