[QueryDSL] 4. ์ค‘๊ธ‰ ๋ฌธ๋ฒ•

2022. 10. 11. 16:31ใ†์ธํ”„๋Ÿฐ/์‹ค์ „! QueryDSL

728x90

 

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard

 

์‹ค์ „! Querydsl - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

Querydsl์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค๋ฌด ํ™œ์šฉ๊นŒ์ง€, ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•ด๋ณด์„ธ์š”!, - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com

์ด ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๐Ÿ™‚

 

 

1๏ธโƒฃ ํ”„๋กœ์ ์…˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ - ๊ธฐ๋ณธ 

 ํ”„๋กœ์ ์…˜ : select ๋Œ€์ƒ ์ง€์ • 

 

- ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ 

ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด ํ•˜๋‚˜๋ฉด ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ. 

ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด ๋‘˜ ์ด์ƒ์ด๋ฉด ํŠœํ”Œ์ด๋‚˜ DTO๋กœ ์กฐํšŒ 

 

 

- ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด ๋‘˜ ์ด์ƒ์ธ ๊ฒฝ์šฐ : ํŠœํ”Œ ์กฐํšŒ 

-> ํŠœํ”Œ ์กฐํšŒ๋Š” ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด ๋‘˜ ์ด์ƒ์ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

๐Ÿค— ์ฐธ๊ณ ๋กœ Tuple์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์•ˆ์—์„œ๋งŒ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , ์„œ๋น„์Šค ๊ณ„์ธต์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š”๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ํ•œ๋‹ค.

Tuple์€ Querydls์— ์ข…์†์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค ๊ณ„์ธต์ด ๊ทธ๋Ÿผ querydls์„ ์˜์กดํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 

2๏ธโƒฃ ํ”„๋กœ์ ์…˜๊ณผ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ - DTO ์กฐํšŒ 

 

- ์ˆœ์ˆ˜ JPA์—์„œ DTO ์กฐํšŒ 

MemberDto

 

QuerydlsBasicTest

-> ์ˆœ์ˆ˜ JPA์—์„œ DTO๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” new ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

DTO์˜ package ์ด๋ฆ„์„ ๋‹ค ์ ์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•˜๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ์ž ๋ฐฉ์‹๋งŒ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. 

 

 

- Querydsl ๋นˆ ์ƒ์„ฑ(Bean population)

๊ฒฐ๊ณผ๋ฅผ DTO ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ 

- ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ
- ํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผ
- ์ƒ์„ฑ์ž ์‚ฌ์šฉ 

 

ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ: setter ์‚ฌ์šฉ 

 

 

ํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผ

-> ํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผ ๋ฐฉ์‹์€ getter, setter ํ•„์š” ์—†์ด ํ•„๋“œ ํƒ€์ž…์„ ๋ณด๊ณ  ์ ‘๊ทผํ•œ๋‹ค. 

 

 

์ƒ์„ฑ์ž ์‚ฌ์šฉ

-> ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ผ๋•Œ๋Š” ํƒ€์ž…์œผ๋กœ ๋งž์ถฐ์„œ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— Dto์ด๋ฆ„๊ณผ ํ•„๋“œ ์ด๋ฆ„์ด ๋‹ฌ๋ผ๋„ ์ƒ๊ด€์—†๋‹ค. 

 

 

๋ณ„์นญ์ด ๋‹ค๋ฅผ ๋•Œ

UserDto

์ด๋ฒˆ์—๋Š” UserDto๋ฅผ ๋งŒ๋“ค์–ด์„œ ํšŒ์› ์ด๋ฆ„์„ username์ด ์•„๋‹Œ name์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‚˜ ํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์—์„œ๋Š” ์ด๋ฆ„์ด ๋‹ฌ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

์ด๋Ÿด ๋•Œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

-> ํ”„๋กœํผํ‹ฐ(setter ์‚ฌ์šฉ๋ฐฉ์‹)๋‚˜, ํ•„๋“œ ์ ‘๊ทผ ์ƒ์„ฑ ๋ฐฉ์‹์—์„œ ์ด๋ฆ„์ด ๋‹ค๋ฅผ ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์ด๋‹ค. 

username.as("name") : ํ•„๋“œ์— ๋ณ„์นญ ์ ์šฉ 

ExpressionUtils.as(source, alias) : ํ•„๋“œ๋‚˜, ์„œ๋ธŒ์ฟผ๋ฆฌ์— ๋ณ„์นญ ์ ์šฉ 

 

 

 

 

3๏ธโƒฃ ํ”„๋กœ์ ์…˜๊ณผ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ - @QueryProjection

 

์ƒ์„ฑ์ž + @QueryProjection

MemberDto

-> MemberDto ์ƒ์„ฑ์ž์— @QueryProjection ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  gradle -> other -> compileJava ์‹คํ–‰ ํ›„ 

build -> rebuild project ํ•ด์ค˜์„œ MemberDto์— ๋Œ€ํ•œ Q ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. 

 

 

@QueryProjection ํ™œ์šฉ

-> ์ด ๋ฐฉ๋ฒ•์€ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ํƒ€์ž…์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ DTO์— QueryDSL ์–ด๋…ธํ…Œ์ด์…˜์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๊ณผ QํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. 

 

 

 

 

4๏ธโƒฃ ๋™์  ์ฟผ๋ฆฌ - BooleanBuilder ์‚ฌ์šฉ 

๋™์  ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ์‹

- BooleanBuilder 
- Where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ 

 

BooleanBuilder ์‚ฌ์šฉ

๊ฐ๊ฐ usernameCond์™€ ageCond์—์„œ null ์ด ์•„๋‹Œ์ง€ ์ฒดํฌํ•ด์„œ null์ด ์•„๋‹ˆ๋ผ๋ฉด 

builder์— and  ๋กœ ์ฒด์ธ์„ ๊ฑธ์–ด์„œ member.username.eq() ์ด๋Ÿฐ ์กฐ๊ฑด์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— where์— builder๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค..!

 

์ง€๊ธˆ ์ฟผ๋ฆฌ์—์„œ๋Š” age๊ฐ€ null์ด๊ธฐ ๋•Œ๋ฌธ์— username๋งŒ ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

5๏ธโƒฃ ๋™์  ์ฟผ๋ฆฌ - Where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ 

where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด BooleanBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ํ›จ์”ฌ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

usernameEq(), ageEq()๋ผ๋Š” ๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , 

๊ฑฐ๊ธฐ์„œ usernameCond์™€ ageCond์˜ null ์ฒดํฌํ›„ ์ด๊ฑธ where ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ,๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

 

where ์กฐ๊ฑด์— null ๊ฐ’์€ ๋ฌด์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์—์„œ ์žฌํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค!!

 

์ด๋ฒˆ์—๋Š” username๊ณผ age์— ๋ชจ๋‘ ๊ฐ’์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— where ์กฐ๊ฑด์ ˆ์— and๋กœ ํ•ด์„œ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

6๏ธโƒฃ ์ˆ˜์ •, ์‚ญ์ œ ๋ฒŒํฌ ์—ฐ์‚ฐ 

 

- ์ฟผ๋ฆฌ ํ•œ๋ฒˆ์œผ๋กœ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ˆ˜์ •

ํšŒ์› ์ค‘ 28์‚ด ๋ณด๋‹ค ์ ์€ ํšŒ์›์˜ ์ด๋ฆ„์„ ๋ชจ๋‘ '๋น„ํšŒ์›'์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ๋Š” ์˜ˆ์ œ์ด๋‹ค. 

์ด๋•Œ ๋ฒŒํฌ ์—ฐ์‚ฐ์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  DB์— ๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, DB์˜ ์ƒํƒœ์™€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. 

๋”ฐ๋ผ์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ•œ๋ฒˆ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ , clear ํ•ด์ค€๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์กฐํšŒ๋ฅผ ํ•ด๋ณด๋ฉด ๋ฐ˜์˜๋œ ๊ฒฐ๊ณผ๊ฐ€ ์กฐํšŒ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

- ๊ธฐ์กด ์ˆซ์ž์— 1 ๋”ํ•˜๊ธฐ 

๊ณฑํ•˜๊ธฐ๋ฅผ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด multiply() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , - ๊ฐ€ ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ add์— -1 ์ด๋Ÿฐ์‹์œผ๋กœ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

- ์ฟผ๋ฆฌ ํ•œ๋ฒˆ์œผ๋กœ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์‚ญ์ œ

 

โญ ์ฃผ์˜

JPQL ๋ฐฐ์น˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์น˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค. 

 

 

 

7๏ธโƒฃ SQL Function ํ˜ธ์ถœํ•˜๊ธฐ 

: SQL function์€ JPA์™€ ๊ฐ™์ด Dialect์— ๋“ฑ๋ก๋œ ๋‚ด์šฉ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์˜ˆ์ œ1) member -> M์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” replace ํ•จ์ˆ˜ ์‚ฌ์šฉ 

 

 

์˜ˆ์ œ2) ์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๋น„๊ตํ•˜๋ผ

-> lower ๊ฐ™์€ ANSI ํ‘œ์ค€ ํ•จ์ˆ˜๋“ค์€ queryDsl์ด ์ƒ๋‹น๋ถ€๋ถ„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ where(member.username.eq(member.username.lower()) ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90