QueryDsl에서 tuple을 dto로 가져오는 방법

MINI·2023년 3월 3일
0

spring

목록 보기
3/3

querydsl에서 entity 전체가 아닌 일부 column만 가져오면 기본 반환 타입으로 Tuple객체를 반환한다.

하지만 Tuple객체를 사용할 때는 하나하나 필드를 알고 있어야 하는 불편함이 있다. Tuple대신 DTO를 사용하면 반환 타입을 좀 더 명시적으로 개발 할 수 있다. QueryDsl에서 Tuple을 DTO로 바꾸는 여러가지 방법을 알아보자.

TUPLE을 DTO로 변환하는 방법


1. Projections.constructor() 사용하기

Projections.constructor() 메서드를 사용하면 쿼리의 결과를 DTO 클래스로 매핑할 수 있다. Projections.constructor() 는 DTO 클래스의 생성자를 인수로 전달하여 DTO 객체를 만들고 초기화한다. 이 방법의 장점은 DTO 객체의 생성 과정을 개발자가 제어 할 수 있다는 것이다.

public List<UserResponse> findAllByEmail(String email){
        return  queryFactory.select(Projections.constructor(UserResponse.class
                ,QUser.user.id
                ,QUser.user.email
                ,QUser.user.nickname
                ))
                .from(QUser.user)
                .where(QUser.user.email.eq(email))
                .fetch();
    }

2. Projections.bean() 사용하기

Projections.bean() 메서드를 사용하면 선택한 속성을 기반으로 DTO 클래스를 매핑한다. 이 방법은 생성자를 호출하는 것이 아니라 기본 생성자를 사용하여 DTO 객체를 만듭니다.

public List<UserResponse> findAllByEmail(String email){
        return  queryFactory.select(Projections.bean(UserResponse.class
                ,QUser.user.id
                ,QUser.user.email
                ,QUser.user.nickname
                ))
                .from(QUser.user)
                .where(QUser.user.email.eq(email))
                .fetch();
    }

3. Projections.fields() 사용하기

Projections.fields() 메서드를 사용하면 엔티티의 필드와 Projection의 필드를 매핑하여 DTO 클래스를

만든다.

public List<UserResponse> findAllByEmail(String email){
        return  queryFactory.select(Projections.fields(UserResponse.class
                ,QUser.user.id
                ,QUser.user.email
                ,QUser.user.nickname
                ))
                .from(QUser.user)
                .where(QUser.user.email.eq(email))
                .fetch();
    }

Projections.fields() 단점

엔티티 필드의 전체 이름을 사용해야 하기 때문에 코드의 가독성과 유지 보수성이 저하 된다.또한 이 방법은 중첩된 필드나 alias(별칭)를 지원하지 않기 때문에 복잡한 쿼리에서 사용하기 어렵다.

profile
느리지만 꾸준히

0개의 댓글