본문 바로가기
Java & Kotlin/Spring

OpenFeign QueryDSL JPA + KSP 설정하기

by devson 2025. 7. 6.

QueryDSL는 Spring Data JPA를 사용하면서 DB 쿼리를 만드는데 de factor standard가 되었다.

(jooQ도 같은 역할로도 사용할 수 있지만 현업에서는 DB 사용 시 JPA를 주로 사용하다보니 QueryDSL가 거의 같이 사용된다)

 

하지만 QueryDSL은 Github repository를 살펴봤을 때 maintain이 멈춘 상태라고 볼 수 있다.

https://github.com/querydsl/querydsl/commits/master/

 

그래도 DB 쿼리를 만드는데 있어서는 문제없이 그럭저럭 사용할 수 있긴 하지만 security 이슈도 있고

 

ksp가 아닌 kapt를 계속 사용해야하는 점도 내키지 않을 수 있다.

https://developer.android.com/build/migrate-to-ksp

 

OpenFeign 진영에서 fork를 한 QueryDSL를 사용한다면 위의 문제를 해결할 수 있다.

(OpenFeign 진영에서 fork를 한 배경에 대해서는 이 글을 확인하면 좋다)

 

Gradle 설정

(Spring 3.5.x, Java 21, Kotlin 1.9.x 기준)

기본적인 Gradle 설정은 아래와 같다.

plugins {
    kotlin("jvm") version "1.9.25"
    ...
    id("com.google.devtools.ksp") version "1.9.25-1.0.20"
}

...

dependencies {
    ...
    
    // QueryDSL
    implementation("io.github.openfeign.querydsl:querydsl-jpa:7.0")
    ksp("io.github.openfeign.querydsl:querydsl-ksp-codegen:7.0")
    // 6.x 버전 설정
    // implementation("io.github.openfeign.querydsl:querydsl-jpa:6.12")
    // ksp("io.github.openfeign.querydsl:querydsl-ksp-codegen:6.12")

    ...
}

...

 

(전체 설정)

더보기
plugins {
    kotlin("jvm") version "1.9.25"
    kotlin("plugin.spring") version "1.9.25"
    id("org.springframework.boot") version "3.5.3"
    id("io.spring.dependency-management") version "1.1.7"
    kotlin("plugin.jpa") version "1.9.25"
    id("com.google.devtools.ksp") version "1.9.25-1.0.20"
}

group = "com.tistory.devs0n"
version = "0.0.1-SNAPSHOT"

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // Kotlin
    implementation("org.jetbrains.kotlin:kotlin-reflect")

    // DB
    runtimeOnly("com.mysql:mysql-connector-j")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    // QueryDSL
    implementation("io.github.openfeign.querydsl:querydsl-jpa:7.0")
    ksp("io.github.openfeign.querydsl:querydsl-ksp-codegen:7.0")
    // 6.x 버전 설정
    // implementation("io.github.openfeign.querydsl:querydsl-jpa:6.12")
    // ksp("io.github.openfeign.querydsl:querydsl-ksp-codegen:6.12")

    // Testing
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

kotlin {
    compilerOptions {
        freeCompilerArgs.addAll("-Xjsr305=strict")
    }
}


allOpen {
    annotation("jakarta.persistence.Entity")
    annotation("jakarta.persistence.MappedSuperclass")
    annotation("jakarta.persistence.Embeddable")
}

tasks.withType<Test> {
    useJUnitPlatform()
}
 

Q class 생성 확인

위와 같이 설정을 하고 프로젝트 build를 하면 정상적으로 Q class가 생성되는 것을 확인할 수 있을 것이다.

 

ksp plugin 버전

참고로 ksp plugin의 경우 더 최신 버전이 존재하지만 SpringBoot 3.5.x 버전에서 지원하는 Kotlin 버전은 1.9.x 버전이기에

더 높은 버전의 ksp plugin을 사용할 수 없다.

 

이는 직접 Kotlin 버전을 변경하여 설정하거나 Spring 메이저 버전이 올라가면서 정식으로 Kotlin 2 버전을 지원할 때를 기다리면 되겠다.

(참고: https://spring.io/blog/2024/10/01/from-spring-framework-6-2-to-7-0)

 

댓글