Maven & Gradle

OpenFeign Querydsl์„ ์˜ˆ์‹œ๋กœ ์•Œ์•„๋ณด๋Š” Spring Boot + Maven ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •๋ฒ•

์•ˆ์ข…ํ˜ 2025. 4. 19. 16:18

๋ชฉํ‘œ : Spring Boot๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ์ง€ ์•Š๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ์›ํ•˜๋Š” ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ์ฐพ์•„๊ฐ€๋Š”์ง€ OpenFeign Querydsl ์„ ์˜ˆ์‹œ๋กœ ์•Œ์•„๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ ํ™˜๊ฒฝ

  • ๋นŒ๋“œ ๋„๊ตฌ: Maven (Gradle์€ ๋ณธ๋ฌธ์—์„œ ์ผ๋ถ€๋งŒ ๊ฐ„๋‹จํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค)
  • IDE: IntelliJ Ultimate
  • ํ”„๋ ˆ์ž„์›Œํฌ: Spring Boot

pom.xml ์„ค์ • ์˜ˆ์‹œ๋Š” ๊ธ€ ํ•˜๋‹จ์˜ "๊ฒฐ๋ก "์— ์ œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์„ค์ •์— ์ด๋ฅด๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

Querydsl vs OpenFeign Querydsl

Querydsl(https://github.com/querydsl/querydsl)

  • 5.0.0 ๋ฒ„์ „: 2021๋…„ 7์›” ๋ฆด๋ฆฌ์Šค
  • 5.1.0 ๋ฒ„์ „: 2024๋…„ 1์›” 30์ผ ๋ฆด๋ฆฌ์Šค

3๋…„ ๊ฐ€๊นŒ์ด ํฐ ์—…๋ฐ์ดํŠธ ์—†์ด ์œ ์ง€๋˜๋‹ค 1๋…„์ „์— ๋ฆด๋ฆฌ์Šค ๋˜๋ฉฐ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

OpenFeign์˜ Querydsl(https://github.com/OpenFeign/querydsl)

OpenFeign์ด ํฌํฌํ•ด์„œ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ Querydsl์€ README์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ตœ์ข… ๋ชฉํ‘œ๋Š” Get a querydsl project active!

์ฆ‰, ๋‹ค์‹œ Querydsl ํ”„๋กœ์ ํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ฐจ์ด๋ฅผ ์†Œ๊ฐœํ•œ ์ด์œ ๋Š” Querydsl๊ณผ OpenFeign Querydsl์€ ์ด๋ฆ„์€ ๋น„์Šทํ•˜์ง€๋งŒ, ์ „ํ˜€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์ด๋‹ˆ Maven/Gradle ์— ํ•„์š”ํ•œ ์˜์กด์„ฑ๋„ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

Querydsl ์˜ ์˜์กด์„ฑ์€ com.querydsl , OpenFeign Querydsl ์˜์กด์„ฑ์€ io.github.openfeign.querydsl ์ž…๋‹ˆ๋‹ค.

 

Spring Boot๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” Querydsl ๋ฒ„์ „

Spring Boot๋Š” ์ž๋™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ๋ฒ„์ „์„ ์ผ์ผ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Spring Boot 3.4.x์—์„œ๋Š” ์–ด๋–ค Querydsl ๋ฒ„์ „์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

 

IntelliJ์—์„œ pom.xml์„ ์—ด๊ณ  ๋‚˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์ž์ฃผ ๋ด…๋‹ˆ๋‹ค.ํ•ด๋‹น ๋นจ๊ฐ„์ƒ‰ ๋„ค๋ชจ๋ฐ•์Šค๋กœ ํ‘œ์‹œ๋œ ์„ค์ •ํŒŒ์ผ์— Ctrl + B ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

pom.xml ์—์„œ ์‚ฌ์šฉ์ค‘์ธ Spring Boot์˜ pom

 

** Gradle ์€ ์–ด๋””์„œ ์ฐพ์•„์•ผ ํ•˜๋Š”์ง€?

Maven์€ ์ด๋ ‡๊ฒŒ IDE์—์„œ ๋ถ€๋ชจ ์„ค์ •์œผ๋กœ ์ž๋™์œผ๋กœ ์ž˜ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, Gradle ์€ Ctrl + B๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ๋ฐ”๋กœ ์ด๋™๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ง์ ‘ ํ•ด๋‹น ์„ค์ • ํŒŒ์ผ์„ ์ฐพ์•„๋ดค์Šต๋‹ˆ๋‹ค.

 

Gradle์€ https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-dependencies/build.gradle ์— ์ ‘์†ํ•ด์„œ ์›ํ•˜์‹œ๋Š” ๊ธฐ์ˆ ์˜ ๋ฒ„์ „์„ ํ™•์ธํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. Spring Boot 3.4.x ๊ธฐ์ค€์œผ๋กœ Querydsl์˜ ๋ฒ„์ „์€ 5.1.0์ž…๋‹ˆ๋‹ค.

Spring Boot 3.4.x ์˜ Querydsl ๋ฒ„์ „

 

๋‹ค์‹œ ๋Œ์•„์™€์„œ Maven์˜ ๊ฒฝ์šฐ, ์•ž์„œ ์–ธ๊ธ‰ํ•œ spring-boot-starter-parent์—์„œ Ctrl + B๋ฅผ ๋ˆ„๋ฅด๋ฉด ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ spring-boot-starter-parent-3.4.4.pom ํŒŒ์ผ์ด ์—ด๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด ํŒŒ์ผ์˜ ๊ฐ€์žฅ ์œ„์ชฝ์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด spring-boot-dependencies๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , Ctrl B ๋ฅผ ํ†ตํ•ด ๋“ค์–ด๊ฐ€๋ฉด ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์ด ์ •์˜๋œ spring-boot-dependencies๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

spring-boot-starter-parent-3.4.4.pom

 

์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ Spring Batch๋‚˜ Spring Data์™€ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ๊ด€๋ฆฌ๋จ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<dependencyManagement>
     <dependency> <!-- Spring Batch ๋ฒ„์ „ -->
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-bom</artifactId>
        <version>${spring-batch.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency> <!-- Spring Data ๋ฒ„์ „ -->
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-bom</artifactId>
        <version>${spring-data-bom.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
 <dependencyManagement>

 

์ด์ œ Ctrl + F๋กœ "querydsl"์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ querydsl ์˜์กด์„ฑ์„ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Spring Boot ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” querydsl ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

์—ฌ๊ธฐ์„œ ${querydsl.version}์ฒ˜๋Ÿผ ${...}๋กœ ๋œ ๋ฌธ๋ฒ•์€ Maven์˜ ๋ณ€์ˆ˜ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Š” Gradle์˜ ext ๋˜๋Š” Java์˜ ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ, ํ•œ ๊ณณ์—์„œ ์„ ์–ธํ•œ ๊ฐ’์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

 

querydsl.version ์„ Ctrl + F ๋กœ ์ฐพ์œผ๋ฉด, <properties> ํƒœ๊ทธ์— 5.1.0 ๋ฒ„์ „์œผ๋กœ ์„ ์–ธํ•œ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

com.querydsl ์˜ ๋ฒ„์ „

์ฆ‰, ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์“ฐ์ด๋Š” Querydsl์˜ ๋ฒ„์ „ 5.1.0์„ querydsl.version์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ณณ์—์„œ ์ด ๊ฐ’์„ ์ฐธ์กฐํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

๊ฒฐ๋ก , ์Šคํ”„๋ง๋ถ€ํŠธ 3.4.x ๋Š” com.querydsl ์˜ 5.1.0 ์„ ์‚ฌ์šฉ์ค‘์ž…๋‹ˆ๋‹ค.

 

OpenFeign Querydsl์˜ ์˜์กด์„ฑ ์„ค์ • ๊ณผ์ •

์•ž์„œ ์‚ดํŽด๋ดค๋“ฏ์ด, Spring Boot 3.4.x๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ com.querydsl์˜ 5.1.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ €๋Š” OpenFeign ํŒ€์—์„œ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” Querydsl์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” OpenFeign Querydsl Github์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ์ง€๊ธˆ๋„ ํ™œ๋ฐœํžˆ 6.11๊ณผ ๊ฐ™์€ ์ตœ์‹  ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์Šค๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด pom.xml์— ๋ฒ„์ „์„ 6.10.1๋กœ ์„ค์ •ํ•˜๊ณ , Maven ๋นŒ๋“œ๋ฅผ ํ–ˆ๋”๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

<properties>
    <java.version>17</java.version> <!-- ํ”„๋กœ์ ํŠธ ์ž๋ฐ” ๋ฒ„์ „ -->
    <querydsl.version>6.10.1</querydsl.version> <!-- ์‚ฌ์šฉํ•  querydsl ๋ฒ„์ „ -->
</properties>

 

์—๋Ÿฌ ๋ฐœ์ƒ !

Non-resolvable import POM: The following artifacts could not be resolved: com.querydsl:querydsl-bom:pom:6.10.1 (absent): com.querydsl:querydsl-bom:pom:6.10.1 was not found in https://repo.maven.apache.org/maven2 during a previous attempt.

 

์ด ์—๋Ÿฌ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • <querydsl.version>์ด๋ผ๋Š” ๋ณ€์ˆ˜๋Š” ์›๋ž˜ Spring Boot์˜ spring-boot-dependencies์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ์ œ๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ด ๋ณ€์ˆ˜๋ฅผ 6.10.1๋กœ override(๋ฎ์–ด์”€) ํ•˜๊ฒŒ ๋˜์—ˆ์œผ๋ฉฐ, Maven ๋นŒ๋“œํ•  ๋•Œ, com.querydsl ์—์„œ 6.10.1 ๋ฒ„์ „์„ ์ฐพ์œผ๋ ค ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ com.querydsl ์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋Š” 5.1.0์ด๋ผ์„œ, 6.10.1์ด๋ผ๋Š” ๋ฒ„์ „์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ Maven์€ "์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์ด๋‹ค"๋ผ๋Š” ์‹์˜ ์—๋Ÿฌ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ <querydsl.version>๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ๋ฒ„์ „์„ ๋ช…์‹œํ•˜๋ฉด ๋˜์ง€๋งŒ, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฒƒ์ด ์˜ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. (๊ฐ ๋ชจ๋“ˆ์— ๊ด€ํ•œ ์„ค๋ช…์€ ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”)

<dependency> <!-- Openfeign Querydsl ์˜ jpa ๋ชจ๋“ˆ -->
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>6.10.1</version>
</dependency>
<dependency> <!-- Openfeign Querydsl ์˜ apt ๋ชจ๋“ˆ -->
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <classifier>jakarta</classifier>
        <version>6.10.1</version>
</dependency>
<dependency> <!-- Openfeign Querydsl ์˜ core ๋ชจ๋“ˆ -->
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
        <version>6.10.1</version>
</dependency>

 

<ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• – ์ปค์Šคํ…€ ๋ณ€์ˆ˜๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ>

Maven์—์„œ๋Š” <properties>์— ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฒ„์ „์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, openfeign.querydsl.version์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์— ๋ฒ„์ „ ์ •๋ณด๋ฅผ ๋‹ด์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ Spring Boot์˜ ์ž๋™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , ์˜์กด์„ฑ ๋ฒ„์ „๋„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

<properties>
        <java.version>17</java.version>
        <openfeign.querydsl.version>6.10.1</openfeign.querydsl.version>
</properties>

<dependency>
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${openfeign.querydsl.version}</version>
</dependency>
<dependency>
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>${openfeign.querydsl.version}</version>
</dependency>
<dependency>
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
        <version>${openfeign.querydsl.version}</version>
 </dependency>

 

OpenFeign Querydsl์˜ ๋ชจ๋“ˆ๋“ค์˜ ์—ญํ• 

์˜์กด์„ฑ์„ ์„ ์–ธํ•  ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€ํ–ˆ๋˜ ๋ชจ๋“ˆ๋“ค์ธ querydsl-jpa, querydsl-apt, querydsl-core ์ด ๊ฐ๊ฐ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€,
๊ณต์‹ ๋ฉ”์ด๋ธ ์ €์žฅ์†Œ(https://mvnrepository.com/artifact/io.github.openfeign.querydsl)์—์„œ ์ง์ ‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ์ €์žฅ์†Œ์— ๊ฐ€๋ณด๋ฉด ์ด 4๊ฐœ์˜ ์ฃผ์š” ๋ชจ๋“ˆ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“ˆ๋ช… ์—ญํ•  ์š”์•ฝ ์„ค๋ช…
querydsl-core ํ•ต์‹ฌ API ๋ชจ๋“  QueryDSL ๊ธฐ๋Šฅ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ณตํ†ต ๋กœ์ง์ด ๋‹ด๊ธด ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ, ํƒ€์ž… ์•ˆ์ „ ์ฟผ๋ฆฌ DSL ๋“ฑ
querydsl-apt ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ Qํด๋ž˜์Šค(ex. QUser)๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ APT(Annotation Processing Tool). ์ปดํŒŒ์ผ ์‹œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถ„์„ํ•ด ์†Œ์Šค์ฝ”๋“œ ์ƒ์„ฑ 
querydsl-jpa JPA์šฉ ํ™•์žฅ JPA ํ™˜๊ฒฝ(Spring Data JPA ํฌํ•จ)์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ
querydsl-sql SQL์šฉ ํ™•์žฅ MyBatis, JDBC ๋“ฑ JPA๊ฐ€ ์•„๋‹Œ ์ˆœ์ˆ˜ SQL ํ™˜๊ฒฝ์—์„œ QueryDSL์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“ˆ

 

์ €์˜ ํ”„๋กœ์ ํŠธ๋Š” JPA ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š”ํ•œ ๋ชจ๋“ˆ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • querydsl-apt : Qํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” APT
  • querydsl-jpa : JPA ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๊ธฐ๋Šฅ๋“ค

"๊ทธ๋ ‡๋‹ค๋ฉด ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ querydsl-core๋Š” ์™œ ์•ˆ ์ถ”๊ฐ€ํ•˜๋‚˜์š”?" 

IntelliJ์—์„œ querydsl-jpa ์˜์กด์„ฑ ์„ ์–ธ ๋ถ€๋ถ„์— Ctrl + B๋กœ ๋“ค์–ด๊ฐ€์„œ ํ™•์ธํ•ด๋ณด๋ฉด, ์ด ๋ชจ๋“ˆ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ฏธ querydsl-core๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, querydsl-jpa๋Š” querydsl-core ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•ด์„œ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, core๋ฅผ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ˆ, core ๋ชจ๋“ˆ์€ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

<properties>
        <java.version>17</java.version>
        <openfeign.querydsl.version>6.10.1</openfeign.querydsl.version>
</properties>
<dependency>
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${openfeign.querydsl.version}</version>
</dependency>
<dependency>
        <groupId>io.github.openfeign.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>${openfeign.querydsl.version}</version>
</dependency>

 

์ฐธ๊ณ . com.querydsl ์‚ฌ์šฉ ์‹œ jakarta ์ด์Šˆ

๋งŒ์•ฝ OpenFeign์ด ์•„๋‹Œ ๊ธฐ์กด com.querydsl ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Spring Boot๊ฐ€ 3.x๋กœ ์˜ฌ๋ผ์˜ค๋ฉด์„œ javax → jakarta๋กœ ์ „ํ™˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Querydsl ๋ฒ„์ „์ด ๋‚ฎ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Qํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ณต์‹ ์ด์Šˆ๋Š” ์—ฌ๊ธฐ์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(https://github.com/querydsl/querydsl/issues/3371)

 

ํ•ด๋‹น ์ด์Šˆ๋ฅผ ์š”์•ฝํ•˜์ž๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ, jakarta ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ์„ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>${querydsl.version}</version>
    <classifier>jakarta</classifier>
</dependency>

 

APT ๋ชจ๋“ˆ์„ ์œ„ํ•œ Maven ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€

querydsl-apt๋Š” @Entity ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ๋ถ„์„ํ•ด Qํด๋ž˜์Šค (์˜ˆ: QUser)๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ์šฐ๋ฆฌ๋Š” ์ด Qclass ๋ฅผ ์ด์šฉํ•ด Querydsl ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— Qclass ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Qclass ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ APT ๋ชจ๋“ˆ์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ„๋„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด OpenFeign Querydsl ์˜ README๋ฅผ ์ฐธ๊ณ ํ•ด๋„, ๊ฒฐ๊ตญ com.querydsl ๋ ˆํผ๋Ÿฐ์Šค ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด, ๊ธฐ์กด Querydsl ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋˜ apt-maven-plugin ์„ค์ •์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค๋งŒ, ์ฐพ์•„๋ณด๋‹ˆ ์ด ๋ฐฉ๋ฒ•์€ ๊ตฌ์‹์œผ๋กœ ์ตœ๊ทผ Maven์—์„œ๋Š” apt-maven-plugin์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , maven-compiler-plugin์˜ <annotationProcessorPaths> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•จ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๊ธฐ์กด ๋ฐฉ๋ฒ•์œผ๋กœ๋„ Qclass ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—  maven-compiler-plugin ์„ค๋ช…์€ ๋‚˜์ค‘์— ํ•ด๋‹น ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ, ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ฒฐ๋ก ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ pom.xml ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

<plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
            <execution>
                 <goals>
                     <goal>process</goal>
                 </goals>
                 <configuration>
                    <outputDirectory>target/generated-sources/java</outputDirectory>
                     <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                 </configuration>
             </execution>
        </executions>
</plugin>

 

๊ฒฐ๋ก 

1. Querydsl ≠ OpenFeign Querydsl
์ด ๋‘˜์€ ์ „ํ˜€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์ด๋ฉฐ, ์˜์กด์„ฑ ๊ทธ๋ฃน๊ณผ ๋ฒ„์ „๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Querydsl ์˜ ์˜์กด์„ฑ์€ com.querydsl , OpenFeign Querydsl ์˜์กด์„ฑ์€ io.github.openfeign.querydsl ์ž…๋‹ˆ๋‹ค.

 

2. Spring Boot๋Š” ๊ธฐ๋ณธ Querydsl๋งŒ ๊ด€๋ฆฌ
OpenFeign Querydsl์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, pom.xml์—์„œ ๋ฒ„์ „์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

3. JPA ํ™˜๊ฒฝ์—์„œ๋Š” querydsl-jpa์™€ querydsl-apt๋งŒ ์žˆ์œผ๋ฉด ์ถฉ๋ถ„
์ด ๋‘ ๋ชจ๋“ˆ์ด ๋‚ด๋ถ€์ ์œผ๋กœ querydsl-core๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ ๋ณ„๋„ ์ถ”๊ฐ€๋Š” ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

 

4. Qclass ์ƒ์„ฑ์„ ์œ„ํ•ด APT ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”
apt-maven-plugin ๋˜๋Š” maven-compiler-plugin ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ Maven์—์„œ OpenFeign Querydsl ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒด pom.xml ์„ค์ •์ž…๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <!-- Spring Boot ๊ณต์‹ parent ์„ค์ • -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.4</version>
        <relativePath/>
    </parent>
	
    ...

    <properties>
        <java.version>17</java.version> <!-- Java ๋ฒ„์ „ -->
        <openfeign.querydsl.version>6.10.1</openfeign.querydsl.version> <!-- Openfeign Querydsl ๋ฒ„์ „ -->
    </properties>

    <dependencies>
        <!-- Spring Data JPA (Hibernate + ORM ์—ฐ๋™) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- QueryDSL (JPA ์ฟผ๋ฆฌ DSL) -->
        <!-- https://mvnrepository.com/artifact/io.github.openfeign.querydsl/querydsl-jpa -->
        <dependency>
            <groupId>io.github.openfeign.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${openfeign.querydsl.version}</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${openfeign.querydsl.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            ...
            <plugin> <!-- Maven ์ปดํŒŒ์ผ ๋•Œ, Qclass ์ƒ์„ฑ -->
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

 

๋งˆ์น˜๋ฉฐ

์ €๋Š” ์ด๋ฒˆ ๊ธ€์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์„ ์–ป์—ˆ๋Š”๋ฐ, ์—ฌ๋Ÿฌ๋ถ„๋„ ํ•จ๊ป˜ ์–ป์–ด๊ฐ€์…จ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • Spring Boot๊ฐ€ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์ฐพ์•„๊ฐ€๊ธฐ
  • Spring Boot๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ์ฐพ์•„์•ผ ํ•˜๋Š”์ง€