mingg IT

[Kotlin] Kotlin + Spring Boot + queryDSL 적용 본문

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

https://v3.leedo.me/devs/51

 

kotlin gradle에서 queryDSL 설정하기

kotlin gradle에서 QueryDSL을 설정했던 내용을 기록으로 남깁니다.

v3.leedo.me

 

Comments