본문 바로가기
Spring

querydsl에서 Tuple 혹은 DTO로 데이터 받기

by 루에 2022. 7. 30.
반응형

querydsl에서 보통 entity로 선언된 클래스의 변환 클래스인 QClass로 데이터를 받게 되나, DTO로 받을 수 있다. 기본적으로 Tuple로 받아서 개발자가 알아서 꺼내 쓸 수도 있겠으나, 좋은 방법이 아님에는 분명하다.

 

DTO로 받는 방법에는 3가지가 있다.

Property 접근(setter, getter)

List<MemberDto> result = queryFactory
                          .select(Projections.bean(MemberDto.class,
                                        member.username,
                                        member.age))
                          .from(member)
                          .fetch();

필드에 직접 접근

List<MemberDto> result = queryFactory
                        .select(Projections.fields(MemberDto.class,
                                    member.username,
                                    member.age))
                        .from(member)
                        .fetch();

생성자 사용

List<MemberDto> result = queryFactory
                            .select(Projections.constructor(MemberDto.class,
                                      member.username,
                                      member.age))
                            .from(member)
                            .fetch();

사용하는 함수를 제외하면 외적으로는 다를바 없다.

 

DTO에 선언된 이름과 querydsl로 도출한 값의 이름이 다른 경우 as 로 이름을 지정한다.

List<UserDto> fetch = queryFactory
                        .select(Projections.fields(UserDto.class,
                                member.username.as("name"),
                                ExpressionUtils.as(
                                    JPAExpressions
                                    .select(memberSub.age.max())
                                    .from(memberSub), "age")
                                ))
                        .from(member)
                        .fetch();

 

@QueryProjection

DTO를 QClass로 생성하는 방법도 있다. DTO의 생성자에 queryProjection 어노테이션을 붙인다.

queryFactory
    .select(new QMemberDto(member.username, member.age))
    .from(member)
    .fetch();

훨씬 간결해졌다. 하지만 DTO가 querydsl에 디펜던시가 걸리게 되므로 여러 곳에서 DTO를 사용하게 될수록 사이드 이펙트의 문제가 발생했을 때 오류 수정에 애로사항이 생길 수 있다. 그러나 늘 그렇듯, 잘 만들어서 잘 쓰면 쉬운게 제일 쉬운길이기도 할 것이다.

 

자세한건 아래 링크

https://doing7.tistory.com/129

반응형

댓글