2022. 10. 11. 16:31ใ์ธํ๋ฐ/์ค์ ! QueryDSL
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
์ด ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ๐
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()) ์ด๋ ๊ฒ ์ฒ๋ฆฌํด๋ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.