Post

[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.beanSetter
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/constructorSetter/ํ•„๋“œ/์ƒ์„ฑ์ž ๋งคํ•‘
Tuple์—ฌ๋Ÿฌ ๊ฐ’ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ

Projections๋Š” โ€œํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐโ€์˜ ๋„๊ตฌ๋‹ค. ํŠนํžˆ DTO Projection์€ ์—”ํ‹ฐํ‹ฐ ๋…ธ์ถœ์„ ๋ง‰๊ณ  ์„ฑ๋Šฅ๋„ ์ข‹์•„, ์กฐํšŒ API์—์„œ ๋„๋ฆฌ ์“ฐ์ธ๋‹ค. ๋งคํ•‘ ๋ฐฉ์‹(bean/fields/constructor)์˜ ์ฐจ์ด๋ฅผ ๊ธฐ์–ตํ•˜์ž.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.