본문 바로가기
JPA

[QueryDSL] @QueryProjection으로 Dto를 Q객체로 만들기

by 띵앤띵 2023. 3. 2.
728x90
반응형

Spring Data JPA에서는 @QueryProjection이라는 어노테이션을 사용하여 Dto를 Q객체로 만들 수 있습니다.

Q객체란?

Q객체는 Querydsl에서 사용되는 객체입니다. Querydsl은 JPA, SQL, MongoDB와 같은 데이터베이스에 대한 타입 안전한 쿼리를 작성할 수 있도록 지원하는 라이브러리입니다. Q객체는 Querydsl에서 사용되는 도메인 객체입니다. Q객체를 사용하여 도메인 객체의 필드명과 타입을 안전하게 사용할 수 있습니다.

@QueryProjection이란?

@QueryProjection은 Querydsl에서 Dto를 Q객체로 변환하기 위한 어노테이션입니다. @QueryProjection 어노테이션을 사용하면 Dto 클래스에 맞는 Q객체를 생성하여 사용할 수 있습니다.

사용 방법

  1. 먼저, Gradle이나 Maven을 사용하여 Querydsl을 의존성으로 추가합니다.
  2. Dto 클래스를 생성합니다.
public class MemberDto {
    private Long id;
    private String username;

    public MemberDto(Long id, String username) {
        this.id = id;
        this.username = username;
    }

    // getter, setter
}

 3. Q객체를 생성합니다.

import static {패키지 경로}.QMember.*;

public class MemberRepositoryImpl extends QuerydslRepositorySupport implements MemberRepositoryCustom {

    public MemberRepositoryImpl() {
        super(Member.class);
    }

    public List<MemberDto> findAllMemberDto() {
        QMember member = QMember.member;

        return from(member)
                .select(new QMemberDto(member.id, member.username))
                .fetch();
    }

    public List<MemberDto> findMemberDtoByUsername(String username) {
        QMember member = QMember.member;

        return from(member)
                .select(new QMemberDto(member.id, member.username))
                .where(member.username.eq(username))
                .fetch();
    }
}

4. Dto 클래스에 @QueryProjection 어노테이션을 추가합니다.

import lombok.Getter;

@Getter
public class QMemberDto extends QueryProjection {

    private Long id;
    private String username;

    public QMemberDto(Long id, String username) {
        this.id = id;
        this.username = username;
    }
}

5. QuerydslPredicateExecutor를 상속받는 인터페이스를 만듭니다.

public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom, QuerydslPredicateExecutor<Member> {
}

6. 사용할 곳에서 Dto를 호출합니다.

@Autowired
MemberRepository memberRepository;

public void test() {
    List<MemberDto> memberDtoList = memberRepository.findAllMemberDto();
    List<MemberDto> memberDtoListByUsername = memberRepository.findMemberDtoByUsername("username");
}

이렇게 @QueryProjection을 사용하여 Dto를 Q객체로 만들면 도메인 객체의 필드명과 타입을 안전하게 사용할 수 있습니다.

정리

이번 포스팅에서는 Spring Data JPA에서 @QueryProjection을 사용하여 Dto를 Q객체로 만드는 방법에 대해 알아보았습니다.

Q객체를 사용하면 도메인 객체의 필드명과 타입을 안전하게 사용할 수 있으며, @QueryProjection을 사용하면 Dto 클래스에 맞는 Q객체를 생성하여 사용할 수 있습니다.

이렇게 Dto를 Q객체로 만들면 데이터베이스에 대한 타입 안전한 쿼리를 작성할 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있습니다.

반응형

'JPA' 카테고리의 다른 글

[JPA] 컬럼 default 값으로 insert  (0) 2022.04.18

댓글