반응형
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를 사용하게 될수록 사이드 이펙트의 문제가 발생했을 때 오류 수정에 애로사항이 생길 수 있다. 그러나 늘 그렇듯, 잘 만들어서 잘 쓰면 쉬운게 제일 쉬운길이기도 할 것이다.
자세한건 아래 링크
반응형
댓글