BackEnd
[Kotlin] Kotlin + Spring Boot + queryDSL 적용
mingg123
2023. 10. 4. 22:01
상황
- 검색 조건등으로 인해 동적 쿼리를 생성할 일이 생겨서 queryDSL을 적용해 보려고 한다.
build.gradle.kt
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.7.6"
id("io.spring.dependency-management") version "1.1.3"
kotlin("jvm") version "1.8.22"
kotlin("plugin.spring") version "1.8.22"
kotlin("plugin.jpa") version "1.8.22"
// 추가
kotlin("kapt") version "1.9.10"
idea
}
java {
sourceCompatibility = JavaVersion.VERSION_17
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
// 추가
implementation("com.querydsl:querydsl-jpa:5.0.0")
kapt("com.querydsl:querydsl-apt:5.0.0:jpa")
runtimeOnly ("com.h2database:h2")
runtimeOnly ("org.postgresql:postgresql")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
jvmTarget = "17"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
tasks.getByName<Jar>("jar") {
enabled = false
}
// 추가
idea {
module {
val kaptMain = file("build/generated/source/kapt/main")
sourceDirs.add(kaptMain)
generatedSourceDirs.add(kaptMain)
}
}
JpaQueryFactoryConfig.kt
@Configuration
class JpaQueryFactoryConfig {
@PersistenceContext
private lateinit var entityManager: EntityManager
@Bean
fun jpaQueryFactory() =
JPAQueryFactory(entityManager)
}
config 폴더 내 생성 해준다.
QClass 파일 생성
./gradlew clean compileKotlin
지정한 폴더 경로로 QClass 들이 생성된 것을 확인할 수 있다.
사용예시
QClass 들이 생성되고나면 QArticle 등 import가 가능해진다.
@Service
class ArticleService (
private val articleRepository: ArticleRepository,
private val queryFactory: JPAQueryFactory
) {
fun searchArticle(articleSearchDTO: ArticleSearchDTO?): List<Article> {
val qArticle = QArticle.article
val query = queryFactory.selectFrom(qArticle)
if (articleSearchDTO != null) {
if (!articleSearchDTO.search.isNullOrBlank()) {
query.where(qArticle.searchKeyword.contains(articleSearchDTO.search))
}
}
return query.fetch()
}
}
queryFactory를 이용하여 search에 값이 들어올 경우에는 searchKeyword 컬럼에서 읽어오고, 없을경우엔 모든 artlcie을 읽어오도록 구현했다.
다음에도 사용할 일이 있을경우, 세팅하는데 참고하려고 작성해둔다.
Reference