[QueryDSL] 6. ์‹ค๋ฌด ํ™œ์šฉ - ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์™€ QueryDSL

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

728x90

 

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

 

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

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

www.inflearn.com

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

 

 

 

1๏ธโƒฃ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ณ€๊ฒฝ 

https://hyejin.tistory.com/m/828

 

[QueryDSL] 5. ์‹ค๋ฌด ํ™œ์šฉ - ์ˆœ์ˆ˜ JPA์™€ QueryDSL

1๏ธโƒฃ ์ˆœ์ˆ˜ JPA ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ Querydsl - ์ˆœ์ˆ˜ JPA๋ฆฌํฌ์ง€ํ† ๋ฆฌ MemberJpaRepository ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ์—†์ด ์ˆœ์ˆ˜ํ•œ JPA ๋งŒ์„ ์‚ฌ์šฉํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ด๋‹ค. ์ฐธ๊ณ ๋กœ findByIdํ•  ๋•Œ ๋ฆฌํ„ดํƒ€์ž…์„ Optional๋กœ ์คฌ๋Š”๋ฐ ์ด์œ ๋Š” id

hyejin.tistory.com

์ €๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ˆœ์ˆ˜ JPA๋กœ ํ–ˆ๋‹ค๋ฉด ์ด์ œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ฅผ ํ™œ์šฉํ•ด์„œ Querydls๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. 

์šฐ์„  ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ฅผ ์‚ฌ์šฉํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. 

 

 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA  - MemberRepository ์ƒ์„ฑ

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์—์„œ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ƒ์„ฑํ•œ ๋‹ค์Œ JpaRepository๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๋œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์—”ํ‹ฐํ‹ฐ์™€ key ๊ฐ’์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

(MemberRepositoryCustom์— ๋Œ€ํ•ด์„œ๋Š” ์ข€ ์žˆ๋‹ค ๋‚˜์˜ฌ ์˜ˆ์ •) 

 

 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ํ…Œ์ŠคํŠธ

MemberRepositoryTest

์ €๋ฒˆ์— ํ–ˆ๋˜ ํ…Œ์ŠคํŠธ์™€ ์™„์ „ ๋˜‘๊ฐ™์€๋ฐ ๊ทธ๋ƒฅ MemberJpaRepository์—์„œ MemberRepository๋กœ ๋ณ€๊ฒฝ๋งŒ ํ•ด์ฃผ๊ณ , ํ…Œ์ŠคํŠธ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋ฌธ์ œ ์—†์ด ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

๐Ÿ˜ฎโ— ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์—์„œ๋Š” Querydsl ์ „์šฉ ๊ธฐ๋Šฅ์ธ ํšŒ์› search๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค..! 

๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ•„์š”ํ•˜๋‹ค.

 

 

 

2๏ธโƒฃ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ

- ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์‚ฌ์šฉ๋ฒ•

1. ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ
2. ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ 
3. ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์† 

์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ํ•  ๋•Œ ํด๋ž˜์Šค๋ช…์€ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ช… + Impl๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

1. ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ

MemberRepositoryCustom

 

 

2. ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

MemberRepositoryImpl

search()์—๋Š” ๊ฒ€์ƒ‰ ์กฐ๊ฑด์œผ๋กœ ํšŒ์›๋ช…, ํŒ€๋ช…, ๋‚˜์ด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

3. ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— MemberRepositoryCustom์„ ์ถ”๊ฐ€๋กœ ์ƒ์†๋ฐ›์•„์„œ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

์ปค์Šคํ…€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋™์ž‘ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

MemberRepositoryTest

์ด๊ฒƒ๋„ ์ „์— ํ–ˆ๋˜ ํ…Œ์ŠคํŠธ์™€ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๋Œ๋ ค๋ณด๋ฉด ํ…Œ์ŠคํŠธ ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

3๏ธโƒฃ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง• ํ™œ์šฉ1 - Querydsl ํŽ˜์ด์ง• ์—ฐ๋™

- ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ์˜ Page, Pageable์„ ํ™œ์šฉ 
- ์ „์ฒด ์นด์šดํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•
- ๋ฐ์ดํ„ฐ ๋‚ด์šฉ๊ณผ ์ „์ฒด ์นด์šดํŠธ๋ฅผ ๋ณ„๋„๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ• 

 

- ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ํŽ˜์ด์ง• 2๊ฐ€์ง€ ์ถ”๊ฐ€

MemberRepositoryCustom

 

 

- ์ „์ฒด ์นด์šดํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ• 

: searchPageSimple(), fetchResults() ์‚ฌ์šฉ 

 

MemberRepositoryImpl

-> Querydsl์ด ์ œ๊ณตํ•˜๋Š” fetchResults()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด์šฉ๊ณผ ์ „์ฒด ์นด์šดํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•  ์ˆ˜์žˆ๋‹ค. (์‹ค์ œ๋กœ๋Š” ์ฟผ๋ฆฌ 2๋ฒˆ ํ˜ธ์ถœ!)

๊ทธ๋ฆฌ๊ณ  fetchResulst()๋Š” ์นด์šดํŠธ ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ํ•„์š”์—†๋Š” order by ๋Š” ์ œ๊ฑฐํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 

 

 

- ์ „์ฒด ์นด์šดํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ• ํ…Œ์ŠคํŠธ

MemberRepositoryTest

-> ์ด๋ ‡๊ฒŒ ์ด ๋‘๋ฒˆ์˜ ์ฟผ๋ฆฌ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

- ๋ฐ์ดํ„ฐ ๋‚ด์šฉ๊ณผ ์ „์ฒด ์นด์šดํŠธ๋ฅผ ๋ณ„๋„๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

: searchPageComplex() 

 

MemberRepositoryImpl

-> ์ „์ฒด ์นด์šดํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ด๋ ‡๊ฒŒ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋œ๋‹ค. 

(์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์ „์ฒด ์นด์šดํŠธ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์ž‡๋‹ค๋ฉด ์ƒ๋‹นํ•œ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค!!) 

 

์ฝ”๋“œ๋ฅผ ๋ฆฌํŽ™ํ† ๋งํ•ด์„œ ๋‚ด์šฉ ์ฟผ๋ฆฌ์™€ ์ „์ฒด ์นด์šดํŠธ ์ฟผ๋ฆฌ๋ฅผ ์ฝ๊ธฐ ์ข‹๊ฒŒ ๋ถ„๋ฆฌํ•˜๋ฉด ์ข‹๋‹ค~~

 

 

 

 

4๏ธโƒฃ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง• ํ™œ์šฉ2 - CountQuery ์ตœ์ ํ™” 

: PageableExecutionUtils.getPage()๋กœ ์ตœ์ ํ™” ๊ฐ€๋Šฅ 

 

MemberRepositoryImpl

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ count ์ฟผ๋ฆฌ๊ฐ€ ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ์•Œ์•„์„œ ์ƒ๋žตํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. 

- ํŽ˜์ด์ง€ ์‹œ์ž‘์ด๋ฉด์„œ ์ปจํ…์ธ  ์‚ฌ์ด์ฆˆ๊ฐ€ ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ์ž‘์„ ๋•Œ

- ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€์ผ ๋•Œ (offset + ์ปจํ…์ธ  ์‚ฌ์ด์ฆˆ๋ฅผ ๋”ํ•ด์„œ ์ „์ฒด ์‚ฌ์ด์ฆˆ ๊ตฌํ•จ) 

 

 

5๏ธโƒฃ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง• ํ™œ์šฉ 3 - ์ปจํŠธ๋กค๋Ÿฌ ๊ฐœ๋ฐœ 

MemberController

ํฌ์ŠคํŠธ ๋งจ์„ ํ†ตํ•ด์„œ ์‹ค์Šตํ•ด๋ณธ๋‹ค~~

 

http://localhost:8080/v2/members?page=0&size=20

 

 

http://localhost:8080/v3/members?page=0&size=110

-> ์ฒซ๋ฒˆ์งธ ํŽ˜์ด์ง€์ด๋ฉด์„œ limit์ด ์ „์ฒด ์ปจํ…์ธ  ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ํฌ๋ฉด count ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค~~

 

 

 

 

 

 

 

 

 

728x90