๐Ÿ—จ๏ธ Backend/Java

QueryDSL ๊ธฐ๋ณธ ๊ฐœ๋… ์ •๋ฆฌ

Kyle99 2025. 6. 18. 12:58

1. QueryDSL์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

QueryDSL์€ Java์—์„œ ํƒ€์ž… ์•ˆ์ „ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ SQL ์ฟผ๋ฆฌ๋Š” ๋ฌธ์ž์—ด๋กœ ์ž‘์„ฑ๋˜์ง€๋งŒ,

QueryDSL์€ ์ด๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

๊ทธ๋กœ ์ธํ•ด SQL ์ฟผ๋ฆฌ์˜ ์•ˆ์ •์„ฑ์ด ๋†’์•„์ง€๊ณ , ์ง๊ด€์ ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ฃผ์š” ํŠน์ง•

  • ํƒ€์ž… ์•ˆ์ „์„ฑ: SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ์ง€ํ–ฅ์  ์ฟผ๋ฆฌ ์ž‘์„ฑ: SQL ์ฟผ๋ฆฌ๋ฅผ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๊ฐ€๋Šฅ: SQL, JPA, MongoDB ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ˜ธํ™˜๋œ๋‹ค.

2. QueryDSL์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

2.1. ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด

SQL ์ฟผ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ์ž‘์„ฑ๋œ๋‹ค.

์ด ๊ฒฝ์šฐ SQL ๊ตฌ๋ฌธ์— ์‹ค์ˆ˜๋‚˜ ์˜คํƒ€๊ฐ€ ์žˆ์„ ๋•Œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ QueryDSL์€ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ์ฃผ๊ณ , ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚จ๋‹ค.

 

2.2. ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

SQL ์ฟผ๋ฆฌ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค.

๋˜ํ•œ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

ํŠนํžˆ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํŒ€์›๋“ค ๊ฐ„์˜ ํ˜‘์—…๊ณผ ์ˆ˜์ •์ด ์‰ฌ์›Œ์ง„๋‹ค.

 

2.3. SQL ์ž‘์„ฑ์˜ ์šฉ์ดํ•จ

QueryDSL์€ SQL ์ฟผ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

JOIN, WHERE, ORDER BY ๋“ฑ์˜ ์กฐ๊ฑด์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ์—๋„ ์œ ์šฉํ•˜๋‹ค.


3. QueryDSL ์‚ฌ์šฉ ํ˜„ํ™ฉ

QueryDSL์€ Java ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ๋งค์šฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.

ํŠนํžˆ JPA์™€์˜ ์—ฐ๋™์„ ํ†ตํ•ด SQL ์ฟผ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด,

์Šคํ”„๋ง ๋ถ€ํŠธ(Spring Boot) ํ”„๋กœ์ ํŠธ์—์„œ JPA์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

Hibernate์™€์˜ ํ†ตํ•ฉ์ด ์ž˜ ๋˜์–ด ์žˆ์–ด ์•ˆ์ •์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  2025.01์— Spring์—์„œ ๊ณต์‹์ ์œผ๋กœ OpenFeign QueryDsl ์ง€์›์„ ๊ฒฐ์ •ํ•˜๊ฒ ๋‹ค๊ณ  ๋ฐœํ‘œํ•œ ๋ฐ” ์žˆ๋‹ค.

 

  • Java ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์„ ์„ ํ˜ธํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์Šคํ”„๋ง ๋ถ€ํŠธ(Spring Boot)์—์„œ JPA/Hibernate์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ๋œ๋‹ค.

4. QueryDSL ์™ธ์— ๋‹ค๋ฅธ ๋Œ€์•ˆ๋“ค

QueryDSL ๋Œ€์•ˆ: MyBatis, JOOQ, Kotlin JDSL, JPQL

 

1. MyBatis

  • ์žฅ์ :
    • ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ๋ฆฌํ•˜๋‹ค.
    • SQL์„ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด ์ž์œ ๋„๊ฐ€ ๋†’๋‹ค.
    • JPA์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ๋‘ ๊ธฐ์ˆ ์„ ํ˜ผํ•ฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ :
    • SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋ถ€์กฑํ•˜๋‹ค.
    • ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ ์‹ค์ˆ˜๋‚˜ ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™œ์šฉ ์‚ฌ๋ก€: MyBatis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ ,

๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ JPA๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

 

2. JOOQ

  • ์žฅ์ :
    • ํƒ€์ž… ์•ˆ์ „์„ฑ ์ œ๊ณต
    • SQL์„ Java ์ฝ”๋“œ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ
    • ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  • ๋‹จ์ :
    • ํ•™์Šต ๊ณก์„ ์ด ๋‹ค์†Œ ๊ฐ€ํŒŒ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
    • SQL ์ž‘์„ฑ์— ์žˆ์–ด ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™œ์šฉ ์‚ฌ๋ก€: ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ SQL์˜ ์ง๊ด€์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๋„๊ตฌ๋กœ ์œ ์šฉํ•˜๋‹ค.

ํŠนํžˆ SQL์„ ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค.

 

3. Kotlin JDSL

  • ์žฅ์ :
    • ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ๊ฐ„ํŽธํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋ฉ”ํƒ€ ๋ชจ๋ธ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— QueryDSL๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๋‹ค.
    • **DSL(Domain Specific Language)**์„ ํ™œ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ :
    • Kotlin์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ, Java ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

ํ™œ์šฉ ์‚ฌ๋ก€: Kotlin ํ”„๋กœ์ ํŠธ์—์„œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฐ–๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋ฉฐ,

๊ฐ„ํŽธํ•˜๊ฒŒ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. JPQL (Java Persistence Query Language)

  • ์žฅ์ :
    • JPA์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค.
    • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๊ณ , ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ :
    • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ฑฐ๋‚˜ ๊ตฌํ˜„์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
    • ๋™์  ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™œ์šฉ ์‚ฌ๋ก€: ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด๋‚˜ JPA์—์„œ ๊ธฐ๋ณธ์ ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ ์œ ์šฉํ•˜๋‹ค.

๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” QueryDSL ๋˜๋Š” MyBatis์™€์˜ ๊ฒฐํ•ฉ์ด ํ•„์š”ํ•˜๋‹ค.

 
ํŠน์ง• QueryDSL MyBatis JOOQ Kotlin JDSL JPQL
ํƒ€์ž… ์•ˆ์ „์„ฑ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ ํƒ€์ž… ์•ˆ์ „์„ฑ ์ œ๊ณต ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ
๊ฐ€๋…์„ฑ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Œ SQL์„ Java ์ฝ”๋“œ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ ๊ฐ„ํŽธํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ๊ฐ€๋Šฅ, ๋ฉ”ํƒ€ ๋ชจ๋ธ ๋ถˆํ•„์š” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด์ง€๋งŒ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์‹œ ๊ฐ€๋…์„ฑ ๋–จ์–ด์ง
์œ ์ง€๋ณด์ˆ˜์„ฑ ๋†’์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๋ฆฌํŒฉํ† ๋ง ์šฉ์ด ์œ ์ง€๋ณด์ˆ˜์— ์–ด๋ ค์›€ SQL ์ œ์–ด๊ฐ€ ์šฉ์ดํ•˜๋‚˜ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ด ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ ์–ด๋ ค์›€
์‚ฌ์šฉ ์šฉ์ด์„ฑ SQL์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ SQL์„ ์ž์œ ๋กญ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ์•ฝ์ด ์žˆ์Œ JOOQ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ Kotlin ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ„ํŽธํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ JPA์™€ ํ†ตํ•ฉ๋˜์–ด ์žˆ์œผ๋‚˜ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ๋ถˆํŽธ
์ฃผ์š” ์‚ฌ์šฉ์ฒ˜ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ, JPA์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ์ ํ•ฉ ๋ณต์žกํ•œ SQL ์ž‘์—…, SQL ์ œ์–ด๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ SQL์„ ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณต Kotlin์„ ์‚ฌ์šฉํ•œ ํƒ€์ž… ์•ˆ์ „์„ฑ ์žˆ๋Š” ์ฟผ๋ฆฌ ์ž‘์„ฑ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์ž‘์„ฑ
  • JPQL์€ JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด๋กœ, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • Kotlin JDSL์€ Kotlin์—์„œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, QueryDSL๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๋ฉ”ํƒ€ ๋ชจ๋ธ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ณ , ๊ฐ„ํŽธํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • JOOQ๋Š” Java๋กœ SQL์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋กœ, ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ SQL์˜ ์ง๊ด€์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. QueryDSL๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ SQL์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • MyBatis๋Š” SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” SQL Mapper์ด๋‹ค. JPA์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋‹ดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค. ์ฃผ๋กœ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ์ž์œ ๋กœ์šด SQL ์ž‘์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.
  • JPA์—์„œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด QueryDSL ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๋Œ€์•ˆ๋“ค์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ ์ค‘์—์„œ MyBatis, JOOQ, Kotlin JDSL, JPQL ๋“ฑ์ด ์ฃผ์š” ๋Œ€์•ˆ์œผ๋กœ ๊ผฝํžŒ๋‹ค. ๊ฐ ๋„๊ตฌ์˜ ํŠน์„ฑ๊ณผ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด ๋ณด์ž.

5. QueryDSL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ

QueryDSL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋„ ์กด์žฌํ•œ๋‹ค.

 

5.1. ํ•™์Šต ๊ณก์„ 

QueryDSL์€ JPA Criteria API์— ๋น„ํ•ด ํ•™์Šต ๊ณก์„ ์ด ์žˆ๋‹ค.

์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ฐฉ์‹์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์— ์ต์ˆ™ํ•ด์ง€๋ฉด ๋งค์šฐ ํšจ์œจ์ ์ด๋‹ค.

 

5.2. ๋ณต์žกํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ

๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋‚˜ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” MyBatis๋‚˜ JPA Criteria API๊ฐ€ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

5.3. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

QueryDSL์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก๋„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


6. QueryDSL ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

QueryDSL์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์•„๋ž˜์˜ ๋‹จ๊ณ„๋ณ„ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผํ•˜๋ฉด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค:

  1. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ค€๋น„: @Entity๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋ฅผ ์ค€๋น„ํ•œ๋‹ค.
  2. QueryDSL ์˜์กด์„ฑ ์ถ”๊ฐ€: Gradle์ด๋‚˜ Maven์„ ํ†ตํ•ด QueryDSL ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  3. ์ฟผ๋ฆฌ ํƒ€์ž… ์ƒ์„ฑ: QueryDSL์€ JPA ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ **Q ํด๋ž˜์Šค(์ฟผ๋ฆฌ ํƒ€์ž…)**๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
  4. ์ฟผ๋ฆฌ ์ž‘์„ฑ: JPAQueryFactory๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  5. ์ฟผ๋ฆฌ ์‹คํ–‰: fetch(), fetchOne() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

7. ๊ฒฐ๋ก 

QueryDSL์€ ํƒ€์ž… ์•ˆ์ „ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•œ ๋„๊ตฌ์ด๋‹ค.

JPA์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ,

ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ์˜ ์žฅ์ ์ด ํฌ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ•™์Šต์ด ํ•„์š”ํ•˜์ง€๋งŒ,

์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค.

QueryDSL์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๋ฉด์„œ ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ๋„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด QueryDSL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์„ ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜๋‹ค