반응형
MongoDB & QueryDSL 연동 방법
다음에는 한 번에 연결하기 위해 글을 작성해 봅니다.!!
Spring Data JPA나 Spring Data MongoDB로 간단한 쿼리는 처리할 수 있지만, 복잡한 쿼리는 가독성이나 안정성 측면에서 QueryDSL을 사용하는 것이 좋다고 느껴서 MongoDB와 QueryDSL 세팅 방법을 공유하고자 합니다.
더보기
Spring RDS 환경 QueryDSL 설정 방법
// querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
build.gradle.kts 작성
// querydsl - mongodb
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
implementation("com.querydsl:querydsl-mongodb:5.0.0") {
exclude(group = "org.mongodb", module = "mongo-java-driver")
}
implementation("com.querydsl:querydsl-apt:5.0.0:jakarta")
kapt("com.querydsl:querydsl-apt:5.0.0:jakarta")
- com.querydsl:querydsl-mongodb:5.0.0 부분이 핵심입니다.
- 진짜 이것 저것 다 찾아보면서, QClass 생성이랑 빌드 실패가 번갈아 가면서 오류가 있어서 헤맸었는데 위 방법으로 build.gradle.kts 작성하면 mongoDB환경에서 QueryDSL을 사용할 수 있었습니다.
- 나머지 의존성도 추가해 주면 정상적으로 사용할 수 있고 build/generated/source/kapt/… 경로에 QClass가 자동으로 생깁니다.
- compileJava, compileKotlin 굳이 작성 안 해도 자동으로 build 폴더에 생성해 줍니다.
⭐️ mongo-java-driver 의존성 충돌 문제 - 해결
implementation("com.querydsl:querydsl-mongodb:5.0.0") {
exclude(group = "org.mongodb", module = "mongo-java-driver")
}
- spring-boot-starter-data-mongodb 의존성을 추가하면 mongodb-driver-sync가 사용됩니다. 하지만, querydsl-mongodb도 추가하게 되면 mongo-java-driver도 추가되어 의존성이 충돌되는 문제가 발생합니다.
- 이 문제를 exclud(group = …, module = …) 작성하여 불필요한 의존성을 제거한 채 사용합니다.
전체 build.gradle.kts
import org.springframework.boot.gradle.tasks.bundling.BootJar
plugins {
val kotlinVersion = "1.9.25"
kotlin("kapt")
kotlin("plugin.jpa") version kotlinVersion
}
allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.Embeddable")
annotation("jakarta.persistence.MappedSuperclass")
annotation("org.springframework.data.mongodb.core.mapping.Document")
}
tasks.named<BootJar>("bootJar") {
enabled = false
}
tasks.named<Jar>("jar") {
enabled = true
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
implementation("org.projectlombok:lombok")
// querydsl - mongodb
implementation("com.querydsl:querydsl-mongodb:5.0.0") {
exclude(group = "org.mongodb", module = "mongo-java-driver")
}
implementation("com.querydsl:querydsl-apt:5.0.0:jakarta")
kapt("com.querydsl:querydsl-apt:5.0.0:jakarta")
}
tasks.test {
useJUnitPlatform()
}
kotlin {
jvmToolchain(17)
}
- Spring Data JPA는 @Entity 어노테이션 사용과 기본 생성자 생성을 위해 추가하였습니다.
Document 예시
@Document(value = "members")
@Entity
data class MemberDocument(
val userName: String,
val email: String,
val isActive: Boolean,
val isAdmin: Boolean,
val profile: String,
val oauthProvider: String,
@Id
val id: String? = null,
override val createdAt: LocalDateTime = LocalDateTime.now(),
override val updatedAt: LocalDateTime = LocalDateTime.now(),
): BaseTimeEntity() {
...
}
- @Document를 통해 문서임을 명시하며 MongoDB에서 저장할 collection 명을 지정합니다.
- @Entity 어노테이션은 QClass를 생성하기 위해 사용하였습니다. QClass를 @Entity 어노테이션을 스캔하여 생성해주고 있어 추가하였습니다. (@QueryEntity를 붙이라는 블로그도 있었지만, QClass 생성과 다른 용도의 어노테이션인 것임을 확인했습니다..)
참고자료
반응형
'Spring Framework > QueryDSL' 카테고리의 다른 글
Querydsl 날짜 연산 문제 해결 : Interval 예약어 미지원 - Java 날짜 객체를 사용하기 (1) | 2024.11.15 |
---|---|
Querydsl OrderSpecifier를 활용한 동적 정렬 방법 - Pathbuilder, Sort (0) | 2024.10.18 |
[Querydsl] JPAExpressions를 활용한 Querydsl 서브쿼리 작성 방법 (0) | 2024.10.17 |
[Querydsl] QueryDSL @QueryProjection 프로젝션 활용법 : DTO, Bean, Field, Constructor 사용법 (0) | 2024.09.16 |
[QueryDsl] QueryDsl groupBy 여러 개 적용하기 (0) | 2024.08.10 |