보통 실무에서 스프링 데이터 JPA를 많이 쓰고 기본 페이징 기능을 많이 쓴다. 이 것을 Querydsl과 어떻게 조합해서 사용할지 알아보자.

public interface MemberRepositoryCustom {
	List<MemberTeamDto> search(MemberSearchCondition condition);
	Page<MemberTeamDto> searchPageSimple(MemberSearchCondition condition, Pageable pageable);
	Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable);
}
@Override
public Page<MemberTeamDto> searchPageSimple(MemberSearchCondition condition, Pageable pageable) {
	QueryResults<MemberTeamDto> results = queryFactory
			.select(new QMemberTeamDto(
					member.id.as("memberId"),
					member.username,
					member.age,
					team.id.as("teamId"),
					team.name.as("teamName")
			))
			.from(member)
			.leftJoin(member.team, team)
			.where(
					usernameEq(condition.getUsername()),
					teamNameEq(condition.getTeamName()),
					ageBetween(condition.getAgeLoe(), condition.getAgeGoe())
			)
			.offset(pageable.getOffset())
			.limit(pageable.getPageSize())
			.fetchResults();

	List<MemberTeamDto> content = results.getResults();
	long total = results.getTotal();

	return new PageImpl<>(content, pageable, total);
}

테스트

@Test
public void searchPageTest() {
	Team teamA = new Team("teamA");
	Team teamB = new Team("teamB");

	em.persist(teamA);
	em.persist(teamB);

	Member member1 = new Member("member1", 10, teamA);
	Member member2 = new Member("member2", 20, teamA);
	Member member3 = new Member("member3", 30, teamB);
	Member member4 = new Member("member4", 40, teamB);

	em.persist(member1);
	em.persist(member2);
	em.persist(member3);
	em.persist(member4);

	MemberSearchCondition condition = new MemberSearchCondition();

	Page<MemberTeamDto> result = memberRepository.searchPageSimple(condition, PageRequest.of(0, 3));
	assertThat(result.getSize()).isEqualTo(3);
	assertThat(result.getTotalElements()).isEqualTo(4);
	assertThat(result.getContent()).extracting("username").containsExactly("member1", "member2", "member3");
}

count쿼리를 별도로 만드는 방법

@Override
public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) {
	List<MemberTeamDto> content = queryFactory
			.select(new QMemberTeamDto(
					member.id.as("memberId"),
					member.username,
					member.age,
					team.id.as("teamId"),
					team.name.as("teamName")
			))
			.from(member)
			.leftJoin(member.team, team)
			.where(
					usernameEq(condition.getUsername()),
					teamNameEq(condition.getTeamName()),
					ageBetween(condition.getAgeLoe(), condition.getAgeGoe())
			)
			.offset(pageable.getOffset())
			.limit(pageable.getPageSize())
			.fetch();

	long total = queryFactory
			.select(member)
			.from(member)
			.where(
					usernameEq(condition.getUsername()),
					teamNameEq(condition.getTeamName()),
					ageBetween(condition.getAgeLoe(), condition.getAgeGoe())
				)
			.fetchCount();

	return new PageImpl<>(content, pageable, total);
}