본문 바로가기
Spring/JPA

@queryProjection 이란 ?

by YoonJong 2023. 2. 24.
728x90

querydsl 프로젝트를 하면서 Dto 생성자에 @queryProjection 을 사용하는 코드를 보았습니다.

 

간단히, Q타입의 파일을 만들어주어, repository 에서 querydsl 코드를 작성할 때 도움을 주는 것으로 학습했는데, 조금 더 자세히 살펴보려고 합니다.

 

먼저, Projection 은 select 절에 대상을 지정하는 것입니다. 즉 테이블에서 원하는 컬럼만 뽑아서 조회할 수 있습니다.

Entity를 직접 사용하면 불필요한 데이터 값을 넘길 수 있는데, 원하는 컬럼만 뽑아 사용한다면 더욱 효율적인 코드를 작성할 수 있기에 충분히 사용할만한 가치가 있다고 생각합니다.

 

편리하지만 아키텍처에 관련해 고려해야 할 점이 있습니다.

Dto 클래스의 생성자가 QueryDsl 에 의존하게 됩니다.

또한, Repository 를 사용하는 컨트롤러나 서비스에서도 의존하게 됩니다.

만약 QueryDsl 를 이후에 사용하지 않을 경우에 전부 변경해주어야 하는 경우가 발생할 수 있습니다.하지만, 어노테이션 하나로 적용하기 때문에, 만약 기술을 변경하더라도 빠르게 해당 어노테이션을 수정 및 삭제 할 수 있다고 생각합니다.

 

이러한 의존성이 부담스럽다면 projection.Setter , Field, Constructor 방식을 사용하는 것이 방법이 될 수 있을 것 같습니다.


@queryProjection 을 사용하면 일반적인 Dto 를 사용하는 것이 아닌 Q타입의 Dto를 사용합니다.

 

사용하는 예시는 아래와 같습니다.

@Data
public class MemberTeamDto {

    private Long memberId;
    private String username;
    private int age;
    private Long teamId;
    private String teamName;

    @QueryProjection // select 절에 대상을 지정한다.
    public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) {
        this.memberId = memberId;
        this.username = username;
        this.age = age;
        this.teamId = teamId;
        this.teamName = teamName;
    }

Dto 생성자에 @QueryProjection 어노테이션을 추가하면 Q타입의 클래스를 생성합니다.

아래와 같이 사용할 수 있습니다.

 

Q타입의 Dto 를 사용하기 때문에, 컴파일 시점에 에러를 잡아주게 되어 더욱 효율적으로 코드를 작성할 수 있습니다.

return queryFactory
        .select(new QMemberTeamDto(
                member.id,
                member.username,
                member.age,
                team.id,
                team.name))...
728x90

댓글