반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 리액트구글애널리틱스
- react
- s3이미지다운로드됨
- gitsquash
- 헤드퍼스트전략패턴
- git squash
- 테스트코드책
- react-ga
- 시스템설계면접예시
- formik submitting not working
- FirebaseAnalytics
- 가상면접으로대규모시스템
- 디자인패턴
- 리팩토링2판4장
- 전략패턴
- formik react-query submitting not working
- cypress React
- 시스템설계면접
- 시스템설계면접팁
- 가상면접3장
- Git commit 합치기
- 시스템설계
- cypressBDD
- awss3
- 가상면접2장
- git commit 협업
- 시스템설계방법
- file not found Error
- 리팩터링2판테스트
- git commit merge
Archives
- Today
- Total
mingg IT
[Kotlin] Kotlin + Spring Boot + queryDSL 적용 본문
상황
- 검색 조건등으로 인해 동적 쿼리를 생성할 일이 생겨서 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
'BackEnd' 카테고리의 다른 글
Comments