[Querydsl] ํ๋ก์ ์ (Projections)
๐ ๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์๋ QueryDSL์ Projections๋ฅผ ์ ๋ฆฌํ๋ค.
Projections๋? ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ํ๋ ํํ(๋จ์ผ ๊ฐยทDTOยทTuple)๋ก ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ. ์ํฐํฐ ์ ์ฒด๊ฐ ์๋๋ผ ํ์ํ ํ๋๋ง ๋ฝ์์ฌ ์ ์๋ค.
1. ๊ธฐ๋ณธ Projection (๋จ์ผ ๊ฐ)
1
2
3
4
List<String> memberNames = queryFactory
.select(member.name) // name๋ง
.from(member)
.fetch();
2. DTO Projection โ 3๊ฐ์ง ๋ฐฉ์
์ฌ๋ฌ ํ๋๋ฅผ DTO๋ก ๋ฐ๋ ๋ฐฉ๋ฒ์ ์ธ ๊ฐ์ง๋ค.
| ๋ฐฉ์ | ๋งคํ ๊ธฐ์ค |
|---|---|
Projections.bean | Setter |
Projections.fields | ํ๋(์ง์ ) |
Projections.constructor | ์์ฑ์ |
1
2
3
4
5
6
7
8
9
10
// bean (Setter ๊ธฐ๋ฐ)
Projections.bean(MemberDto.class, member.name, member.age)
// constructor (์์ฑ์ ๊ธฐ๋ฐ)
Projections.constructor(MemberDto.class, member.name, member.age)
// fields + ๋ณ์นญ(as)
Projections.fields(MemberProjection.class,
member.name.as("username"), // ํ๋๋ช
์ด ๋ค๋ฅด๋ฉด as๋ก ๋งคํ
member.age)
1
2
3
4
List<MemberDto> dtos = queryFactory
.select(Projections.constructor(MemberDto.class, member.name, member.age))
.from(member)
.fetch();
๐ก ํ๋๋ช ์ด DTO์ ๋ค๋ฅด๋ฉด
.as("๋ณ์นญ")์ผ๋ก ๋ง์ถ๋ค.
3. Tuple Projection
์ฌ๋ฌ ๊ฐ์ Tuple๋ก ๋ฐ๋๋ค.
1
2
3
4
5
List<Tuple> tuples = queryFactory
.select(member.name, member.age) // ์ฌ๋ฌ ๊ฐ โ Tuple
.from(member)
.fetch();
// tuple.get(member.name), tuple.get(member.age)๋ก ์ ๊ทผ
๐ ์ฃผ์์ฌํญ๊ณผ ํ
๐ก DTO Projection์ ์ฐ๋ฉด ์ํฐํฐ-DTO ๊ฐ ์์กด์ฑ์ ๋ฎ์ถ๊ณ ํ์ํ ํ๋๋ง ๊ฐ์ ธ์, ์ฑ๋ฅยท๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ํจ๊ณผ์ ์ด๋ค.
๐ ์ ๋ฆฌ
1
2
3
4
5
QueryDSL Projections
โโ ๋จ์ผ ๊ฐ .select(member.name)
โโ DTO bean(Setter) / fields(ํ๋) / constructor(์์ฑ์)
โโ ๋ณ์นญ .as("username")
โโ Tuple ์ฌ๋ฌ ๊ฐ โ Tuple
| ๊ฐ๋ | ํ ์ค ์ ์ |
|---|---|
| Projections | ๊ฒฐ๊ณผ๋ฅผ ์ํ๋ ํํ๋ก |
| bean/fields/constructor | Setter/ํ๋/์์ฑ์ ๋งคํ |
| Tuple | ์ฌ๋ฌ ๊ฐ ๋ด๋ ์ปจํ ์ด๋ |
Projections๋ โํ์ํ ๊ฒ๋ง ๊ฐ์ ธ์ค๊ธฐโ์ ๋๊ตฌ๋ค. ํนํ DTO Projection์ ์ํฐํฐ ๋ ธ์ถ์ ๋ง๊ณ ์ฑ๋ฅ๋ ์ข์, ์กฐํ API์์ ๋๋ฆฌ ์ฐ์ธ๋ค. ๋งคํ ๋ฐฉ์(bean/fields/constructor)์ ์ฐจ์ด๋ฅผ ๊ธฐ์ตํ์.
Comments powered by Disqus.