inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

프로젝션과 결과 반환 - @QueryProjection

QueryProjection 수동으로 만들면 어떨까요?

해결된 질문

494

명아주

작성한 질문수 8

1

안녕하세요! 초보개발자 명아주입니다.
QueryProejction 사용 시, DTO가 QueryDSL 에 의존적인게 단점이라고 하셨습니다. 그 외에는 컴파일 레벨에서 체크할 수 있다는게 정말 큰 장점인 것 같습니다.
 
그래서 혹시 의존성을 갖지 않으면서 이걸 사용할 방법이 없을까? 라는 의문으로 한가지 테스트를 해보고 찾은 해결 방법은 CustomQUserDto 를 직접 만들어서 쓰면 어떨까 싶습니다.
CustomQUserDto는 레포지토리 계층에서만 쓰고, 반환값은 UserDto로 나가니까 서비스에서는 CustomQUserDto를 몰라도 상관이 없을것 같다고 생각했습니다.
 
package study.querydsl.repository.dto;

import com.querydsl.core.types.ConstructorExpression;
import com.querydsl.core.types.Expression;

import com.querydsl.dto.UserDto;

public class CustomQUserDto extends ConstructorExpression<UserDto> {

public CustomQUserDto(Expression<String> name, Expression<Integer> age) {
super(UserDto.class, new Class<?>[]{String.class, int.class}, name, age);
//혹은 심플하게 super(UserDto.class, name, age); 라고 해도 됩니다.
}
}
샘플코드는 자동생성된 QMemberDto를 참고해서 이렇게 짜봤습니다. serialVersionUID는 어떻게 처리해야될지 몰라서 없앴고 없어도 테스트 상에서는 문제없었습니다.
@Test
public void findUserDtoByManualQueryProjection() throws Exception {
//given
//when
List<UserDto> result = query
.select(new CustomQUserDto(member.username, member.age))
.from(member)
.fetch();

//then
for (UserDto userDto : result) {
System.out.println("userDto = " + userDto);
}
}
위처럼 테스트를 진행해봤을때 정상적으로 동작하는걸 확인했는데요.
혹시 이런식으로 QueryProjectionDto를 수동으로 만들어서 사용하시는 경우가 있으신지 궁금합니다.
 
감사합니다.
명아주 드림
 
새해 복많이 받으세요~~~~
 
p.s 한가지 질문드리고 싶은점이 있는데, 강의들으면서 따라 치는 코드를 깃허브에 올리고 있는데 혹시 문제가 된다면 비공개 레포로 변경하려고 합니다. 답변 주시는 대로 원하시는대로 처리하겠습니다!
 
 

QueryProjection JPA java

답변 1

1

김영한

새해 복 많이 받으세요. 명아주님^^

이 코드에서도 ConstructorExpression을 사용하는데요. 이 부분 자체가 Querydsl 코드에 의존하게 됩니다.

다음 import를 참고해주세요.

import com.querydsl.core.types.ConstructorExpression;

import com.querydsl.core.types.Expression;

따라서 해당 문제가 해결되는 것은 아닙니다. 그래도 이렇게 고민하신 부분은 너무 좋네요.

 

추가로 소스코드는 유료 강의이기 때문에 비공개로 사용해주세요^^

감사합니다.

0

명아주

안녕하세요. 초보개발자 명아주입니다.

 

UserDto는 별도로 있고, CustomQUserDto를 만들었기때문에 UserDto 자체는 의존하지 않지만, CustomQUserDto는 Querydsl에 의존하고 있다고 생각했습니다.

뭔가 UserDto를 변경하거나 하면 CustomQUserDto도 따라서 변경해줘야되는 등 번거로움이 있긴 한것 같습니다.

이 부분은 뭔가 더 깔끔한 유틸클래스를 만들어서 해결할 방법이 없을지 고민해보겠습니다!

 

소스코드 레포지토리는 모두 비공개로 변경했습니다!

 

감사합니다!! 즐거운 연휴 보내세요~~

 

0

김영한

제가 해당 기능을 사용해보지 않아서 오해를 했습니다.

ConstructorExpression를 사용하면 UserDto 자체는 손대지 않아도 되는군요.

저도 사용해본 적은 없는데, 장점이 있는 방법이네요^^

클래스를 별도로 만들어야 하는게 조금 귀찮고, 싱크하기가 힘들기는 하겠지만 그래도 DTO를 순수하게 유지할 수 있는 좋은 대안이네요.

좋은 내용 공유 감사합니다.

0

명아주

감사합니다!

말씀하신 장단점을 해결할 은탄환(은탄환은 없지만)을 고민해보고 뭔가 만들게 된다면 또 공유하겠습니다!

join에대해 질문드립니다.

0

10

1

SpringBoot 4.X에서의 Querydsl 설정

0

157

2

querydsl 오픈소스에 대한 질문

1

101

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

127

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

349

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

86

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

172

1

querydsl sum() 메서드 없어요.

0

169

2

build 디렉터리 생성

0

152

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

123

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

99

1

오타 제보 드립니다.

0

79

2

벌크 연산과 flush, clear

0

85

1

Run As Intellij 로 변경시 Q타입 import 불가

0

95

1

QHello import하기 문제 발생

0

157

2

등록된 함수 보는법(H2Dialect) 질문

0

76

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

209

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

213

1

querydsl 설정 문제

0

228

2

quey dsl 설정부분

0

168

2

count 쿼리 관련 질문입니다!

0

79

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

98

1

답변부탁드리겠습니다.

0

95

2

(OrderSpecifier)관련 내용 어디있을가요

0

68

1