๐งญ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
'Dev > SpringData' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] N + 1 ์ด์ (0) | 2021.12.17 |
---|---|
[JPA] ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ(๋ฌดํ ๋ฃจํ) (0) | 2021.12.14 |
[Querydsl] QueryDSL ์ฌ์ฉ๋ฒ ์ ๋ฆฌ (0) | 2021.12.03 |
[Spring] DTO ์ฌ์ฉ๋ฒ์์ ๋ํ์ฌ (0) | 2021.11.12 |
[JPA]Fetch.Lazy๋ฅผ ์ค์ ํ์๋ @OneToOne์์ ๋ฐ์ํ๋ ์ด์ (0) | 2021.10.13 |