
이번 내용에서는 스프링 데이터의 페이징 기능을 Querydsl 과 어떻게 조합해서 쓰는지, Querydsl 에서 어떻게 활용하는지 알아보자.
1) 사용자 정의 인터페이스 - 페이징을 위한 메서드 추가
이전에 만들어둔 사용자 정의 인터페이스에 searchPage 를 추가했다.
( 참고로 페이징 처리를 위한 파라미터와 반환타입으로 스프링 데이터의 Page, Pageable 를 활용했다. )
public interface MemberRepositoryCustom {
List<MemberTeamDto> searchByBuilder(MemberSearchCondition condition);
List<MemberTeamDto> searchByWhere(MemberSearchCondition condition);
Page<MemberTeamDto> searchPage(MemberSearchCondition condition, Pageable pageable);
}
2) 사용자 정의 인터페이스 구현체 - 메서드 오버라이딩
사용자 정의 인터페이스에 추가한 searchPage 를 구현부에서 오버라이딩했다.
@Override
public Page<MemberTeamDto> searchPage(MemberSearchCondition condition, Pageable pageable) {
List<MemberTeamDto> content = queryFactory
.select(new QMemberTeamDto(
member.id,
member.username,
member.age,
team.id,
team.name
))
.from(member)
.leftJoin(member.team, team)
.where(
usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch(); // fetch() 로 내용(컨텐츠) 조회
long total = queryFactory
.select(member)
.from(member)
.leftJoin(member.team, team)
.where(
usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
)
.fetchCount(); // fetchCount() 로 카운트 조회
return new PageImpl<>(content, pageable, total);
}
offset() 과 limit() 을 사용해서 몇 번째 부터 몇 건을 조회할 것인지 정의하였다.
그리고 참고로 여기서는 데이터 내용(컨텐츠)과 전체 카운트를 별도로 조회했다.
( fetchResults() 를 사용하면 데이터 내용과 전체 카운트를 한번에 조회할 수 있다. (실제 쿼리는 2번 호출) )
3) 조회 API 컨트롤러 개발
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberRepository memberRepository;
@GetMapping("/members")
public Page<MemberTeamDto> searchMember(MemberSearchCondition condition, Pageable pageable) {
return memberRepository.searchPage(condition, pageable);
}
}
4) 결과 확인
/members?page=0&size=1
참고로 실제 실무에서는 더욱 복잡한 조건과 쿼리문이 적용될 것이기 때문에,
페이징 처리를 위한 다양한 구현 방법, 그리고 쿼리 최적화 방안 등에 대해서도 고민과 학습이 필요하다.
강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.
정리 진짜 잘하셧네요