프로젝션 대상이 하나라면 쿼리 조회 결과 타입을 명확하게 지정할 수 있다.
프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회한다.
다양한 데이터 타입을 막 담아서 꺼낼 수 있는 것
해당 타입을 repository계층 안에서 사용하는 것은 좋으나 service, controller까지 넘어가는 설계는 좋지 않다.
핵심 비즈니스 로직을 앞단에서 알게 되는 것을 경계해야 한다.
Tuple은 Querydsl에 종속되어있는 타입이기 때문에 Tuple보다는 DTO 객체를 사용하는 것이 좋다.
(나중에 Querydsl이 아닌 다른 것으로 변환할 때도 유연하게 코드 수정이 가능함)
사용해야할 경우 가급적이면 repository 계층 내에서만 사용하는 것을 권장한다.
결과를 DTO로 반환할 때 사용
@QueryProjection
사용하는 Dto의 생성자에 붙임 -> Dto에 대한 Q파일 생성이 됨.
해당 Q파일로 조회를 하게되니 해당 어노테이션이 붙어있는 생성자의 타입이랑 안 맞으면
컴파일 시 바로 에러가 발생함(디버깅하기 편함).
* 생성자(Projection.constructor)를 사용하여 조회할 경우 실행을 했을 때
에러가 발생함 (Runtime Exception).
* @QueryProjection을 사용하면 코드를 작성하는 시점에 에러가 발생함(개발 안정성++).
단점
결론 : 큰 단점은 아닌 듯