[Spring Boot] Querydsl 조회 결과 DTO반환

재피터노트북·2022년 11월 18일
0
post-thumbnail

Querydsl Bean 생성(Bean population)

  • 프로퍼티 접근
  • 필드 직접 접근
  • 생성자 사용

MemberDto

public class MemberDto {
      private String username;
      private int age;
      public MemberDto() {
      }
      public MemberDto(String username, int age) {
          this.username = username;
          this.age = age;
      }
}

프로퍼티 접근 - Setter

List<MemberDto> result = queryFactory
          .select(Projections.bean(MemberDto.class,
                  member.username,
                  member.age))
          .from(member)
		  .fetch();
  • 프로퍼티로 접근할때는 Projections.bean(해당Dto.class, 적용할필드)

필드 직접 접근

List<MemberDto> result = queryFactory
		  .select(Projections.fields(MemberDto.class,
                  member.username,
                  member.age))
          .from(member)
		  .fetch();
  • 필드값을 직접 바꾸는 필드 직접 접근은 Projcetions.fields(해당Dto.class, 적용할 필드)

생성자 사용

List<MemberDto> result = queryFactory
        .select(Projections.constructor(MemberDto.class,
              member.username,
              member.age))
        .from(member)
        .fetch();
  • 생성자를 사용할려면 Projcetion.constructor(해당Dto.class, 해당필드)

@QueryProjection

DTO의 생성자에 이 어노테이션을 붙여주면 빌드시 DTO가 Q파일로 생성됨 사용할 때는 new QDto()이런식으로 생성자를 생성하듯 사용하면됨. 이 방법은 컴파일러로 타입을 체크할 수 있으므로 가장 안전한 방법. 다만 DTO에 QuertDSL어노테이션을 유지해야 하는 점과 DTO까지 Q파일을 생성해야 하는 단점이 있음.

@QueryProjection을 사용한 MemberDto

@Data
public class MemberDto {
      private String username;
      private int age;
      public MemberDto() {
      }
      
      @QueryProjection
      public MemberDto(String username, int age) {
          this.username = username;
          this.age = age;
      }
}
  • 이렇게 생성자에 @QueryProjection어노테이션을 붙여줌.
  • 그후 ./gradlew compileQuerydsl으로 빌드
  • QMemberDto 생성 확인

@QueryProjcetion 활용


List<MemberDto> result = queryFactory
            .select(new QMemberDto(member.username, member.age))
            .from(member)
            .fetch();
  • 만들어진 QMemberDto의 생성자를 직접 만들어주는 방식

Reference

김영한의 실전 Querydsl

profile
난 이 재 선

0개의 댓글