프로젝션?

프로젝션이란 select 절에 뭘 가져올지 대상을 지정하는 것을 의미합니다.

프로젝션 대상이 하나

단순히 사용자 이름만 가져오는 경우를 생각해봅시다.

List<String> result = queryFactory
       .select(member.username)
       .from(member)
       .fetch();

반환 타입을 String 으로 맞추면 됩니다. username 만 가져오기 때문입니다. 타입이 하나 밖에 없으니까요. (참고로 Member 엔티티 타입으로 받아도 프로젝션 대상이 하나인 것입니다.)

프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있습니다.

하지만 타입이 둘 이상이면 불가능하겠죠.

타입이 둘 이상인 경우는 튜플이나 DTO 로 조회를 해야합니다.

튜플 조회

튜플은 QueryDsl 이 여러개를 조회할 때를 대비해서 만들어놓은 타입입니다.

import com.querydsl.core.Tuple

List<Tuple> result = queryFactory
         .select(member.username, member.age) //...1
         .from(member)
         .fetch();
         
for (Tuple tuple : result) {
		String username = tuple.get(member.username); //...2
    Integer age = tuple.get(member.age); //...2
    System.out.println("username=" + username);
    System.out.println("age=" + age);
}
  1. username 과 age 를 가져옵니다. 프로젝션 대상이 둘 이상인 것이죠.
  2. get()