🧩 @QueryProjection

정의

@QueryProjectionQuerydsl에서 생성자 기반 DTO 조회를 타입 안전하게 사용하기 위한 애너테이션이다. DTO 생성자에 붙이면 Querydsl이 해당 생성자에 맞는 Q타입을 만들어준다.

select 결과를 DTO로 받을 때 컴파일 시점에 생성자 매핑 오류를 줄일 수 있다.

🧩 역할

  • 생성자 기반 DTO 조회를 타입 안전하게 만든다
  • Querydsl이 QDTO를 생성하도록 돕는다
  • 조회 결과를 엔티티가 아닌 DTO로 받을 때 유용하다
  • 컬럼 순서 오류를 줄이는 데 도움이 된다

🛠 사용법

DTO 생성자에 적용

import com.querydsl.core.annotations.QueryProjection;

public class UserSummary {

    private final Long id;
    private final String name;

    @QueryProjection
    public UserSummary(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}

Querydsl에서 사용

List<UserSummary> result = queryFactory
        .select(new QUserSummary(user.id, user.name))
        .from(user)
        .fetch();

🧩 특징

  • 생성자 파라미터 순서와 타입이 중요하다
  • DTO 생성자에 애너테이션을 붙여야 한다
  • Querydsl APT 설정이 필요하다
  • QDTO 클래스를 생성한 뒤 그 타입을 사용한다

⚠️ 주의사항

  • 생성자 파라미터와 select 컬럼 타입이 맞아야 한다.
  • Querydsl APT가 설정되어 있어야 Q타입이 생성된다.
  • 엔티티 조회보다 DTO 조회에 적합하다.
  • 하나의 생성자 매핑을 기준으로 사용하므로 구조를 단순하게 유지하는 것이 좋다.

📌 정리

  • @QueryProjection은 Querydsl의 타입 안전한 DTO 조회를 위한 애너테이션이다.
  • DTO 생성자에 붙이고, 생성된 QDTO로 조회한다.
  • 복잡한 조회 결과를 안정적으로 DTO로 받고 싶을 때 유용하다.

연결문서

댓글남기기