개발/Java, Kotlin

[Kotlin] SpringBoot 동적쿼리를 위한 QueryDsl 설정하기 + 간단한 사용 방법

Kangjieun11 2023. 11. 17. 20:32
728x90

 

✅ QueryDSL 설정하기

 

 

1️⃣ build.gradle.kts에 plugins 추가

plugins {

	//for querydsl
	kotlin("kapt") version "1.7.10"
}

 

2️⃣ dependencies 추가

이후 dependencies를 추가해주면 되는데, 

나는 kapt에서 빨간줄이 뜨길래 plugins만 추가하고, 빌드한번 해준 다음 dependencies를 추가했다.

dependencies {

	//querydsl
	implementation("com.querydsl:querydsl-jpa:5.0.0")
	kapt("com.querydsl:querydsl-apt:5.0.0:jpa")
}

 

3️⃣ Build

빌드 성공시 인텔리제이 좌측 상단 

build > generated > source > kapt > main > com > ... 엔티티 파일 위치에 QClass가 생긴것을 확인할 수 있다.

 

 

 

 

✅ QueryDSL 사용하기

 

1️⃣ JPAQueryFactory를 빈으로 등록하는 설정파일을 추가해준다.

 

나는 configuration 디렉터리를 하나 추가해 관리하고 있어서 이곳에 추가했다.

 

 

import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import javax.persistence.EntityManager
import javax.persistence.PersistenceContext

@Configuration
class QueryDslConfig {
    @PersistenceContext
    lateinit var entityManager: EntityManager

    @Bean
    fun jpaQueryFactory(): JPAQueryFactory {
        return JPAQueryFactory(entityManager)
    }
}

 

 

 

✍️ 이전에 QueryDsl을 처음 공부할때 그린 그림

 

https://jie0025.tistory.com/254

 

[Spring] QueryDSL

개인적으로 공부하면서 정리한 내용입니다 : ) FLAG Project - BE Study 2022.11.10 QueryDSL 왜 QueryDSL을 사용할까? SQL, JPQL의 문제점 JPA Criteria 문제의 해결 : QueryDSL QueryDSL의 장점 동적쿼리 vs 정적쿼리 JPQL vs

jie0025.tistory.com

 

 

사용할때 아래와 같은 형태로 정의해주면된다. 

 

 

 

 

⬇️ 자세한 설명 여기

 

✔️ DomainCustomRepository 인터페이스를 생성한다. 여기에 동적쿼리를 사용할 메서드들을 정의한다.

interface EmployeeSeatCustomRepository {
	fun methodName(number: Long): Domain 
}

 

 

✔️ DomainCustomRepository에 정의한 메서드들을  실제로 구현DomainCustomRepositoryImpl을 생성한다.

 

아래 예제는,

1.  qDomain을 변수로 만든다.

2.  jpaQueryFactory에 qClass로 접근, myNumber와 DB의 number와 값이 같은(.eq) 것을

3.  1개 가져와 반환하는 쿼리문이다. 

@Repository
class DomainCustomRepositoryImpl (
        private val jpaQueryFactory: JPAQueryFactory
): DomainCustomRepository {

    override fun methodName(myNumber: Long): Domain {
		val qDomain = QDomain.domain

		val query = jpaQueryFactory
                    .selectFrom(qDomain)
                    .where(qDomain.domain.number.eq(myNumber))
            return query.fetchOne()
    }
}

 

 

 

 

✔️ 기존에 DB와 연결하던 DomainRepository 인터페이스 우측에 DomainCustomRepository를 추가해주면 된다. 

interface DomainRepository: JpaRepository<EmployeeSeat, Long>, DomainCustomRepository {
  
}

 

 

빌드하고 요청을 보내보면, 정상적으로 작동하는것을 확인할 수 있다!

 

 

 

 


references

https://jie0025.tistory.com/254

https://shanepark.tistory.com/421