프로젝션(Projection) : select 대상 지정
프로젝션 대상이 하나면 하나의 타입을 명확하게 지정 가능
프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회
Tuple -> 서비스, 컨트롤러까지 넘어가면 좋지 않은 설계다.
DTO로 변환해서 사용하자.
프로젝션과 결과 반환 : DTO 조회
결과를 DTO 반환할때 사용
총 3가지의 방법을 지원한다.
1. setter 접근(프로퍼티 접근) 방식 (주의 : 기본생성자가 있어야한다. -> @NoArgsConstructor)
... Projections.bean(MemberDto.class, member.username, member.age)
2. 필드 직접 접근
... Projections.fields(MemberDto.class, member.username, member.age)
3. 생성자 사용
... Projections.constructor(MemberDto.class, member.username, member.age)
프로젝션과 결과 반환 : @QueryProjection 활용
@QueryProjection -> 컴파일 시점에서 에러를 발견할 수 있다.
단점
Q파일을 생성해야한다.
DTO 자체가 QueryDsl 어노테이션에 의존하게 된다. -> 하지만 실용적이다.