728x90

๐ŸงญQuerydsl Projection

Projection์€ ํ…Œ์ด๋ธ”์˜ ํŠน์ •ํ•œ ์นผ๋Ÿผ๋“ค๋งŒ ๋”ฐ๋กœ ์กฐํšŒํ•œ๋‹ค๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ, DTO๋กœ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋•Œ DTOํด๋ž˜์Šค๋กœ ๋ฐ˜ํ™˜๋ผ๊ธฐ ์œ„ํ•ด Projection ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ๋‹ค. 

  • Tuple
  • Projection.bean
  • Projection.constructor
  • Projection.field
  • @QueryProjection

๐Ÿ“กTuple์„ ์ด์šฉํ•œ Projection

void ProjectionByTuple()throws Exception{
    List<Tuple>tuples = jpaQueryFactory
    		.select(member.name, member.age)
            .from(member)
            .fetch();

        
}

 

  • Tuple์„ ํ†ตํ•ด์„œ ๋ฐ˜ํ™˜์€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Tuple์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.Tuple ์€ com.querydsl.core import ๋ฅผ ๋ฌผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„์— querydsl ์„ ์“ฐ์ง€ ์•Š๋„๋ก ์„œ๋น„์Šค๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ๋˜๋ฉด ์œ ์—ฐํ•œ ๋Œ€์ฒ˜๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ“กProjection.Bean

//DTO
@Setter
@NoArgsConstructor
public static class MemberDtoByBean{
   private String name;
   private int age;
}

void ProjectionByBean()throws Exception{
    List<MemberDto.MemberDtoByBean> memberDto = jpaQueryFactory
            .select(Projections.bean(MemberDto.MemberDtoByBean.class,member.name,member.age))
            .from(member)
            .fetch();

   memberDto.forEach(System.out::println);
}
  • Projection.Bean()์ด์šฉํ•˜์—ฌ Setter๋ฅผ ํ†ตํ•ด์„œ ์กฐํšŒํ•œ๋‹ค.

 

๐Ÿ“กProjection.constructor

//DTO
public static class MemberDtoByConstructor{
    private String name;
    private int age;

    public MemberDtoByConstructor(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

void ProjectionByConstructor()throws Exception{
    List<MemberDto.MemberDtoByConstructor> memberDto = jpaQueryFactory
          .select(Projections.constructor(MemberDto.MemberDtoByConstructor.class, member.name, member.age))
          .from(member)
          .fetch();
}
  • DTO์— ์ƒ์„ฑ์ž๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค๊ณ  Projection.constructor๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์กฐํšŒํ•˜๋Š”๊ฐ’์€ DTO ์ƒ์„ฑ์ž์— ๋ฌด์กฐ๊ฑด ๋“ค์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“กProjection.field

//DTO
@NoArgsConstructor
public static class MemberDtoByField{
     private String name;
     private int age;
}

void ProjectionByField()throws Exception{
      List<MemberDto.MemberDtoByField> memberDto = jpaQueryFactory
          .select(Projections.fields(MemberDto.MemberDtoByField.class, member.name, member.age))
          .from(member)
          .fetch();
}
  • Projection.field๋ฅผ ์ด์šฉํ•  ๋•Œ๋Š” DTO๋ฅผ ๋งŒ๋“ค๊ณ  ํ•„๋“œ๊ฐ’์„ ์‚ฝ์ž…ํ•œ๋‹ค.
  • ์ ‘๊ทผ ์ง€์ •์ž๊ฐ€ private๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ๊ฐ’์˜ ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(projection ๋‚ด๋ถ€์— ๋ฆฌํ”Œ๋ ‰์…˜ API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.)

 

๐Ÿ“ก@QueryProjection

//DTO
@Getter
public static class MemberDtoByQueryProjection{
    private String name;
    private int age;

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

}

void ProjectionByQueryProjection()throws Exception{
   List<MemberDto.MemberDtoByQueryProjection> memberDto = jpaQueryFactory
          .select(new QMemberDto_MemberDtoByQueryProjection( member.name, member.age))
          .from(member)
          .fetch();
}
  • DTOํด๋ž˜์Šค ์ƒ์„ฑ์ž์— @QueryProjection์„ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„ ๋†“๊ณ  ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
  • compileQuerydsl์„ ์ˆ˜ํ–‰์‹œ์ผœ์ฃผ๋ฉด Q-Class์— Dtoํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

๋ฌด์—‡์„ ์“ฐ๋˜์ง€ ์ƒ๊ด€์—†๋‹ค.

Constructor์„ ํ†ตํ•œ Projection์กฐํšŒ ์‹œ์—๋Š” .select()์ ˆ์— ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•ด๋„ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์ „์— ์ธ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ @QueryProjection์€ ์ƒˆ๋กœ์šด ์นผ๋Ÿผ ์ถ”๊ฐ€์‹œ, ์ปดํŒŒ์ผ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์‚ฌ์ „์— ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ ์‰ฝ๋‹ค.

setter๋‚˜ field๋Š” ์ƒˆ๋กœ์šด ์นผ๋Ÿผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ Projection ์œ ํ˜•์ด setter,field์ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒํ•˜์—ฌ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ป์˜ˆ์ œ ์ฝ”๋“œ : https://github.com/ryudongjae/blog-ex

 

GitHub - ryudongjae/blog-ex: ๐Ÿ“๋ธ”๋กœ๊ทธ ์˜ˆ์ œ ์ฝ”๋“œ

๐Ÿ“๋ธ”๋กœ๊ทธ ์˜ˆ์ œ ์ฝ”๋“œ . Contribute to ryudongjae/blog-ex development by creating an account on GitHub.

github.com


Reference

 

728x90