[Java / Kotlin] QueryDSL 설정

임근수임근수
2 min read

기존 mybatis 설정 및 구현되어있던 부분을 점점 JPA 전환하기 위해 작업하면서 필요에 따라 QueryDSL 사용도 필요 할것으로 예상되어 (물론 QueryDsl 구현부도 존재합니다.) 설정한 부분을 기록하고자 합니다.

파트는 maven / gradle 로 정리해볼까 합니다.

공통적으로 Qtable 사용을 위한 classpath 내 빌드 위치가 필요했구요.. QueryDSL사용 해보신 분들은 아시겠지만 빌드 안되어 있을때 소스파일내에 오류 등 약간(?) 불편한 부분도 없지 않아 있겠습니다. (적응하면 크게 어렵진 않겠지만요 ㅎㅎ)

Maven 설정

maven apt 설정(kotlin + java 구성되어 있어 java 로 생성된 코드에만 Qtable 생성가능하도록)

  • maven (spring boot 2.x) 였습니다.
<plugins>
...
    <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>

</plugins>

[프로젝트내 Qtable 생성화면]

Gradle 설정

  • Gradle

gradle kapt 설정 (kapt 버전이 더이상 증가되진 않지만…. KSP 에서 테스트 및 검증 이후 상용화 결정예정)

https://developer.android.com/studio/build/migrate-to-ksp?hl=ko

spring boot 3.x + kspt : 신규 프로젝트에 적용하였습니다. (spring boot 3.x)

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

buildscript {
    dependencies {
        classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21")
        classpath("org.jetbrains.kotlin:kotlin-allopen:1.7.21")
        classpath("org.jetbrains.kotlin:kotlin-noarg:1.7.21")
    }
}
plugins {
    id("org.springframework.boot") version "3.1.0"
    id("io.spring.dependency-management") version "1.1.0"
    kotlin("jvm") version "1.8.21"
    kotlin("plugin.spring") version "1.8.21"

    kotlin("kapt") version "1.8.22" //Querydsl
    idea
}

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

group = "com.crypted.kssupport"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenCentral()
    //mavenLocal() dev test 용도

    maven {
        url = uri("<https://maven.pkg.github.com/kstadium/ks-common-java>")
        credentials {
            username = project.findProperty("gpr.user") as String? ?: System.getenv("USERNAME")
            password = project.findProperty("gpr.key") as String? ?: System.getenv("TOKEN")
        }
    }
}

dependencies {
    [... 중략]
}

idea {
    module {
        val kaptMain = file("build/generated/source/kapt/main")
        sourceDirs.add(kaptMain)
        generatedSourceDirs.add(kaptMain)
    }
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "17"
    }
}
0
Subscribe to my newsletter

Read articles from 임근수 directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

임근수
임근수