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

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

728x90

 

 

1๏ธโƒฃ ์ˆœ์ˆ˜ JPA ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ Querydsl 

 

- ์ˆœ์ˆ˜ JPA๋ฆฌํฌ์ง€ํ† ๋ฆฌ 

MemberJpaRepository

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ์—†์ด ์ˆœ์ˆ˜ํ•œ JPA ๋งŒ์„ ์‚ฌ์šฉํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ด๋‹ค. 

์ฐธ๊ณ ๋กœ findByIdํ•  ๋•Œ ๋ฆฌํ„ดํƒ€์ž…์„ Optional๋กœ ์คฌ๋Š”๋ฐ ์ด์œ ๋Š” id๋กœ ์กฐํšŒ๋ฅผ ํ–ˆ์„ ๋•Œ, ์ด์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์›์ด ์—†์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Optional๋กœ ํ•œ๋ฒˆ ๊ฐ์‹ธ์„œ ๋ฆฌํ„ดํ•ด์คฌ๋‹ค. 

 

 

 

- ์ˆœ์ˆ˜ JPA๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ…Œ์ŠคํŠธ

-> ์•ž์—์„œ ๋งŒ๋“  MemberJpaRepository๊ฐ€ ๋ฌธ์ œ์—†์ด ์ž˜ ๋Œ์•„๊ฐ€๋Š”์ง€ ๋‹จ์ˆœํžˆ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ์ด๋‹ค. 

(ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” ๋‹น์—ฐํžˆ ์„ฑ๊ณต) 

 

 

2๏ธโƒฃ Querydsl ์‚ฌ์šฉ 

 

- ์ˆœ์ˆ˜ JPA๋ฆฌํฌ์ง€ํ† ๋ฆฌ : Querydsl ์ถ”๊ฐ€ 

findAll()๊ณผ findByUsername()์— ๋Œ€ํ•ด์„œ Querydsl์ง  ์ฝ”๋“œ์ด๋‹ค. 

(ํ™•์‹คํžˆ ํ›จ์”ฌ ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.)

 

 

- QueryDsl์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ 

์•ž์—์„œ ํ–ˆ๋˜ ํ…Œ์ŠคํŠธ์—์„œ findAll() ์„ findAll_Querydsl()๋กœ, findByUsername()์„ findByUsername_Querydsl()๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ…Œ์ŠคํŠธ๋งŒ ์ง„ํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (์–ด์ฐจํ”ผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ) 

 

 

โญ๏ธ JpaQueryFactory ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 

์ง€๊ธˆ JpaQueryFactory๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ƒ์„ฑํ•  ๋•Œ๋Š” 

์ด๋Ÿฐ์‹์œผ๋กœ ์ƒ์„ฑ์ž์—์„œ JpaQueryFactory๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ EntityManagrer๋ฅผ ์ฃผ์ž…ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ƒฅ JpaQueryFactory๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. 

์ด๋ ‡๊ฒŒ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๊ณ , ๊ทธ๋ƒฅ ์˜์กด์„ฑ ์ฃผ์ž…๋ฐ›์•„์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. 

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ•˜๋ฉด ๋กฌ๋ณต์˜ @RequiredArgsConstructor๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์€ ์žˆ์ง€๋งŒ, 

ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์˜์กด์„ฑ์— ๋Œ€ํ•ด์„œ 2๊ฐœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ์กฐ๊ธˆ ๋” ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. 

 

์ด๊ฑด ๊ทธ๋ƒฅ ์„ ํƒํ•ด์„œ ์ž๊ธฐ๊ฐ€ ํ•˜๊ณ ์‹ถ์€ ๋ฐฉ์‹๋Œ€๋กœ ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค~~

 

 

โ—๏ธ ์ฐธ๊ณ  : ๋™์‹œ์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฑฑ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

์™œ๋ƒํ•˜๋ฉด ์—ฌ๊ธฐ์„œ ์Šคํ”„๋ง์ด ์ฃผ์ž…ํ•ด์ฃผ๋Š” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์‹ค์ œ ๋™์ž‘ ์‹œ์ ์— ์ง„์งœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ฐพ์•„์ฃผ๋Š” ํ”„๋ก์‹œ์šฉ ๊ฐ€์งœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์ด๋‹ค.  ์ด ๊ฐ€์งœ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์‹ค์ œ ์‚ฌ์šฉ ์‹œ์ ์— ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €(์˜์†์„ฑ ์ปจํ…์ŠคํŠธ)๋ฅผ ํ• ๋‹นํ•ด์ค€๋‹ค. 

 

 

 

 

3๏ธโƒฃ ๋™์  ์ฟผ๋ฆฌ์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์กฐํšŒ - Builder ์‚ฌ์šฉ 

 

MemberTeamDto 

: ์กฐํšŒ ์ตœ์ ํ™”์šฉ DTO ์ถ”๊ฐ€ 

 ์ด๋ฒˆ์—๋Š” ์ƒ์„ฑ์ž์— @QueryProjection์„ ์‚ฌ์šฉํ•ด์„œ QํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  DTO๋ฅผ ํ”„๋กœ์ ์…˜์œผ๋กœ ์กฐํšŒํ•ด์˜ฌ ๊ฒƒ์ด๋‹ค. 

์ด๋•Œ QMEmberTeamDto๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ./gradlew compileJava ํ•œ๋ฒˆ ํ•ด์ฃผ๊ณ , build -> rebuild Project ํ•ด์ฃผ๊ธฐ~

 

โ—๏ธ ์ฐธ๊ณ  

@QueryProjection์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น DTO๊ฐ€ QueryDsl์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค. 

์ด๋Ÿฐ ์˜์กด์ด ์‹ซ๋‹ค๋ฉด ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ฑฐํ•ด์ฃผ๊ณ  Projection.bean(), Projection.fields(), Projections.constructor() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

https://hyejin.tistory.com/821

 

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

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard ์‹ค์ „! Querydsl - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜ Querydsl์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค๋ฌด ํ™œ์šฉ๊นŒ์ง€, ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•ด๋ณด์„ธ์š”!, - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ... www.inflearn.com..

hyejin.tistory.com

 

 

MemberSearchCondition

: ํšŒ์› ๊ฒ€์ƒ‰ ์กฐ๊ฑด 

 

 

๋™์ ์ฟผ๋ฆฌ : Builder ์‚ฌ์šฉ 

MemberJpaRepository

username๊ณผ teamname์— ๋Œ€ํ•ด์„œ null ์ฒดํฌํ•  ๋•Œ๋Š” StringUtils์˜ hasText() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•ด์คฌ๋‹ค. 

๋”ฐ๋ผ์„œ null ์ด ์•„๋‹ˆ๋ฉด BooleanBuilder ์— and ์กฐ๊ฑด์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. 

 

๋™์ ์ฟผ๋ฆฌ๋ฅผ ์™„์„ฑํ•œ builder ์— ๋Œ€ํ•ด์„œ๋Š” where ์กฐ๊ฑด์— builder๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. 

 

 

์กฐํšŒ ์˜ˆ์ œ ํ…Œ์ŠคํŠธ

๊ฒ€์ƒ‰ ์กฐ๊ฑด์— 35 ~ 40 ์‚ด ์‚ฌ์ด๋ฅผ ์กฐํšŒํ•˜๊ณ , ๊ทธ ๋‹ค์Œ team ์ด๋ฆ„์€ teamB์ธ ํšŒ์›์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ…Œ์ŠคํŠธ์ด๋‹ค. 

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋‚˜์˜จ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” member4๊ฐ€ ์ž˜ ๋‚˜์˜ค๋ฉด ๋œ๋‹ค. 

 

 

 

4๏ธโƒฃ ๋™์  ์ฟผ๋ฆฌ์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์กฐํšŒ - Where์ ˆ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ 

 

MemberJpaRepository

: Where ์ ˆ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ 

BooleanBuilder ์‚ฌ์šฉํ•  ๋•Œ๋ž‘ ๋น„์Šทํ•˜๊ธด ํ•œ๋ฐ ์ด๋ฒˆ์—๋Š” where ์กฐ๊ฑด์— ํŒŒ๋ผ๋ฏธํ„ฐ ๋กœ ์กฐ๊ฑด์„ ๋‚˜์—ดํ–ˆ๋‹ค. 

usernameEq, teamNameEq, ageGoe, ageLoe ๋ฉ”์†Œ๋“œ๋ฅผ ๋”ฐ๋กœ ๋นผ์„œ ์กฐ๊ฑด์œผ๋กœ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค. 

์ด๋•Œ where ์ ˆ์— Null์€ ๋ฌด์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ์ถ”๊ฐ€ํ•ด์ค˜๋„ ๋œ๋‹ค. 

 

์ด ๋ฐฉ๋ฒ•์˜ ์žฅ์ ์€ ์กฐ๊ฑด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. 

 

-> ์ด๋Ÿฐ์‹์œผ๋กœ where ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐฉ์‹์€ ๋‹ค๋ฅธ query์—์„œ๋„ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

 

5๏ธโƒฃ ์กฐํšŒ API ์ปจํŠธ๋กค๋Ÿฌ ๊ฐœ๋ฐœ 

๊ฐ„๋‹จํ•œ API๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋‹ค. 

๊ทผ๋ฐ ์ด ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ํ”„๋กœํŒŒ์ผ์„ ์„ค์ •ํ•ด์ค€๋‹ค. 

 

- ํ”„๋กœํŒŒ์ผ ์„ค์ • 

src/main/resoureces/application.yml 

 

src/test/resources/application.yml

: ํ…Œ์ŠคํŠธ๋Š” ๊ธฐ์กด application.yml ์„ ๋ณต์‚ฌํ•ด์„œ ๋‹ค์Œ ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌํ•˜๊ณ , ํ”„๋กœํŒŒ์ผ์„ test๋กœ ์ˆ˜์ • 

 

-> ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด main ์†Œ์Šค์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ ์†Œ์Šค์ฝ”๋“œ ์‹คํ–‰ ์‹œ ํ”„๋กœํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

- ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

InitMember

InitMember ํด๋ž˜์Šค์•ˆ์— ๋‚ด๋ถ€์— InitMemberService๋ฅผ ๋งŒ๋“ค์–ด์„œ Team๊ณผ Member ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. 

๋‚˜์ค‘์— ํŽ˜์ด์ง• ๊ด€๋ จํ•ด์„œ๋„ ํ…Œ์ŠคํŠธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ 100๊ฐœ ๋งŒ๋“ค์–ด๋‘”๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ ์™œ ๊ตณ์ด InitMemberService ๋ผ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€? ์— ๋Œ€ํ•ด์„œ๋Š” 

@PostConstruct ์–ด๋…ธํ…Œ์ด์…˜๊ณผ @Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•จ๊ป˜ ๋™์ž‘์ด ์ž˜ ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

 

- ์กฐํšŒ ์ปจํŠธ๋กค๋Ÿฌ

MemberController

์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ƒฅ ๊ฐ„๋‹จํžˆ MemberSearchCondition๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํฌ์ŠคํŠธ๋งจ์„ ์ด์šฉํ•ด์„œ ํ…Œ์ŠคํŠธํ–ˆ๋‹ค. 

 

http://localhost:8080/v1/members?teamName=teamB&ageGoe=30&ageLoe=60

 

 

 

 

 

 

 

 

 

728x90