본문 바로가기

좋아하는 것_매직IT/1.spring

QueryDSL에서의 @QueryProjection 어노테이션 깔끔정리

반응형

QueryDSL은 자바 기반의 영속성 프레임워크에서 강력하고 효과적인 쿼리 작성을 도와주는 라이브러리입니다.

이 라이브러리를 사용할 때, @QueryProjection 어노테이션은 DTO(Data Transfer Object)를 생성할 때 중요한 역할을 합니다.

QueryDSL과 DTO

QueryDSL을 사용하면 JPA 엔터티의 필드를 직접 사용하여 동적 쿼리를 작성할 수 있습니다.
하지만 종종 특정 쿼리의 결과를 매핑하기 위해 엔터티 필드보다는 DTO를 사용하게 됩니다.
이때 @QueryProjection 어노테이션은 DTO의 생성자를 표시하고, QueryDSL이 해당 생성자를 활용하여 DTO를 생성할 수 있도록 도와줍니다.

@QueryProjection 어노테이션의 의미

@QueryProjection 어노테이션은 해당 생성자가 QueryDSL에서 사용되어야 함을 나타냅니다.
QueryDSL은 이 어노테이션을 통해 DTO 클래스 내의 특별한 생성자를 찾아내고, 그 생성자를 이용하여 DTO 객체를 생성합니다.

728x90

예시 코드

import com.querydsl.core.annotations.QueryProjection;

public class MagicEntityDTO {
    private String name;
    private int age;

    // 기본 생성자, 게터, 세터 등 생략

    @QueryProjection
    public MagicEntityDTO(String name, int age) {
        this.name = name;
        this.age = age;
    }
}


설명
위의 코드에서 @QueryProjection 어노테이션은 MagicEntityDTO 클래스의 특별한 생성자에 사용됩니다.
이 생성자는 QueryDSL이 사용자 정의한 엔터티(MagicEntity)의 필드를 매핑하여 DTO 객체를 생성할 때 활용됩니다.

QueryDSL을 통한 DTO 생성

public List<MagicEntityDTO> findEntitiesWithQueryDSL() {
    QMagicEntity magicEntity = QMagicEntity.magicEntity;

    return new JPAQueryFactory(entityManager)
            .select(Projections.constructor(MagicEntityDTO.class, magicEntity.name, magicEntity.age))
            .from(magicEntity)
            .fetch();
}

설명
Projections.constructor 메서드는 @QueryProjection 어노테이션이 있는 생성자를 활용하여 DTO 객체를 생성하도록 QueryDSL에 지시합니다.

이를 통해 쿼리 결과를 MagicEntityDTO로 변환하여 반환할 수 있습니다.

마무리

@QueryProjection 어노테이션은 QueryDSL을 사용하여 DTO를 생성할 때 중요한 역할을 하는데,
특히 동적 쿼리에서 엔터티 필드 대신 DTO를 사용하고자 할 때 유용하게 활용됩니다.

이 어노테이션을 통해 QueryDSL은 사용자가 정의한 DTO를 간편하게 생성하고,
쿼리 결과를 목적에 맞게 매핑할 수 있습니다.

오늘의 티스토리는 여기까지고요.
항상 믿고 봐주셔서 감사합니다.

300x250