728x90
반응형
SMALL

스프링 데이터 JPA에서 Querydsl을 지원하는 QuerydslRepositorySupport 라는 추상 클래스가 있다. 어떤걸 도와주냐면 우리가 이전에 사용했던 Querydsl 용 리포지토리를 아래와 같이 변경해보자.

public class MemberRepositoryImpl extends QuerydslRepositorySupport implements MemberRepositoryQueryDsl {

    // private final JPAQueryFactory queryFactory;

    public MemberRepositoryImpl(Class<?> domainClass) {
        super(Member.class);
    }
    
    ...
    
}
  • 기존에는, extends QuerydslRepositorySupport 가 없었는데 이 부분을 추가했다.
  • 그리고, JPAQueryFactory를 주입 받아야 하는 부분도 제거했다. 대신 저 QuerydslRepositorySupport를 상속받으면 반드시 생성자를 만들어 줘야 하는데 그 부분이 바로 이 부분이다.
public MemberRepositoryImpl(Class<?> domainClass) {
    super(Member.class);
}

 

이렇게 해주면 아래와 같은 장점이 있다.

  • JPAQueryFactory를 주입받지 않아도 된다.
  • from()으로 시작하는 쿼리를 작성할 수 있다. (이게 장점인지는 모르겠다)
  • getQuerydsl().applyPagination() 이라는 스프링 데이터가 제공하는 페이징을 Querydsl로 편리하게 반환이 가능한데 사실 이것도 편리한지는 잘 모르겠다. 심지어 Sort도 제대로 동작안한다.
@Override
public List<MemberTeamDto> search(MemberSearchCondition condition) {
    return from(member)
            .leftJoin(member.team, team)
            .where(usernameEq(condition.getUsername()),
                    teamNameEq(condition.getTeamName()),
                    ageGoe(condition.getAgeGoe()),
                    ageLoe(condition.getAgeLoe())
            ).select(new QMemberTeamDto(
                    member.id.as("memberId"),
                    member.username,
                    member.age,
                    team.id.as("teamId"),
                    team.name.as("teamName")))
            .fetch();

    /*return 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()),
                    ageGoe(condition.getAgeGoe()),
                    ageLoe(condition.getAgeLoe())
            ).fetch();*/
}
  • 주석 처리한 부분이 기존에 작성했던 코드이다.
  • 보면, from()으로 시작하는데, select()가 뒤에 있고 뭔가 좀 어색하고 쿼리를 한번에 읽기엔 명시적이지 않다. 난 이걸 장점으로 생각하지는 않는다. 
@Override
    public Page<MemberTeamDto> searchPaging(MemberSearchCondition condition, Pageable pageable) {

        JPQLQuery<MemberTeamDto> jpaQuery = from(member)
                .leftJoin(member.team, team)
                .where(usernameEq(condition.getUsername()),
                        teamNameEq(condition.getTeamName()),
                        ageGoe(condition.getAgeGoe()),
                        ageLoe(condition.getAgeLoe())
                ).select(new QMemberTeamDto(
                        member.id.as("memberId"),
                        member.username,
                        member.age,
                        team.id.as("teamId"),
                        team.name.as("teamName")));

        JPQLQuery<MemberTeamDto> query = getQuerydsl().applyPagination(pageable, jpaQuery);
        query.fetch();

        /*List<MemberTeamDto> result = 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()),
                        ageGoe(condition.getAgeGoe()),
                        ageLoe(condition.getAgeLoe())
                )
                .offset(pageable.getOffset())
                .limit(pageable.getPageSize())
                .fetch();

        JPAQuery<Member> countQuery = queryFactory
                .select(member)
                .from(member)
                .leftJoin(member.team, team)
                .where(usernameEq(condition.getUsername()),
                        teamNameEq(condition.getTeamName()),
                        ageGoe(condition.getAgeGoe()),
                        ageLoe(condition.getAgeLoe())); */

        return PageableExecutionUtils.getPage(result, pageable, () -> countQuery.stream().count());
    }
  • 이게 이제 페이징을 좀 편리하게 해준다는 getQuerydsl().applyPagination()을 사용한 방법인데, 기존에 작성했던 코드랑 차이점은 쿼리에 offset(), limit()을 작성하지 않는다는 점이다. 
  • 근데, 이거 하나 줄이겠다고 저렇게 from()부터 시작하는 게 영 맘에 들지는 않는다.
728x90
반응형
LIST

'Querydsl' 카테고리의 다른 글

JPA 레포지토리와 Querydsl  (2) 2024.12.26
Querydsl 중급 문법  (0) 2024.12.22
Querydsl 기본 문법  (0) 2024.12.21
[Renewal] QueryDsl  (0) 2024.12.07
Spring Boot 3.1.5에서 QueryDSL 설치하기  (0) 2023.11.26

+ Recent posts