QueryDslSupport

2024. 7. 21. 15:15TIL

✔오늘 배운 중요한 🔑 point

  • QueryDslSupport는 QueryDSL을 사용할 때 필요한 기본 설정을 제공하는 역할을 한다.

🎯 오늘 배운 내용

 

QueryDslSupport란?

QueryDslSupport는 추상 클래스이며 다른 클래스에서 상속하여 기능을 확장하는 데 사용됩니다. 이 경우, QueryDslSupport는 QueryDSL을 사용할 때 필요한 기본 설정을 제공하는 역할을 한다.

 

사용 예시 

package sparta.nbcamp.wachu.infra.querydsl

import com.querydsl.jpa.impl.JPAQueryFactory
import jakarta.persistence.EntityManager
import jakarta.persistence.PersistenceContext

abstract class QueryDslSupport {
    @PersistenceContext
    protected lateinit var entityManager: EntityManager

    protected val queryFactory: JPAQueryFactory
        get() {
            return JPAQueryFactory(entityManager)
        }
}

 

@Repository
class WineQueryDslRepositoryImpl : WineQueryDslRepository, QueryDslSupport() {
}

QueryDslSupport()를 구현하는 식으로 사용하면 된다.

 

@PersistenceContext

@PersistenceContext는 JPA의 애노테이션으로, 엔티티 매니저(EntityManager)를 주입받기 위해 사용된다. 엔티티 매니저는 JPA에서 데이터베이스 작업을 관리하는 핵심 인터페이스로, 엔티티를 생성, 읽기, 업데이트, 삭제하는 작업을 수행한다.

protected lateinit var entityManager: EntityManager

lateinit var는 Kotlin에서 변수를 나중에 초기화할 수 있게 해주며

protected로 선언되어 있어 이 클래스를 상속하는 클래스에서 접근할 수 있다.

entityManager는 JPA의 EntityManager로, 데이터베이스 작업을 수행하는 데 사용된다.

protected val queryFactory: JPAQueryFactory

 

 

queryFactory는 JPAQueryFactory 타입의 프로퍼티로, 이를 통해 QueryDSL을 사용할 수 있다. get() 메서드를 통해 entityManager를 사용하여 JPAQueryFactory인스턴스를 반환합니다.

JPAQueryFactory는 QueryDSL의 핵심 클래스 중 하나로, JPA 기반의 동적 쿼리를 작성할 때 사용다. 이를 통해 복잡한 SQL 쿼리를 타입 세이프하고 가독성 좋게 작성할 수 있다.

 

 

간단한 사용 코드

class WineQueryDslRepositoryImpl : WineQueryDslRepository, QueryDslSupport() {

    fun forTest(wineName: String){
        val wine = Qwine.wine
        return queryFactory.selectFrom(wine)
            .where(wine.name.eq(wineName))
            .limit(10)
            .fetch()
    }

 

해당 코드는  아래의 SQL 쿼리를 의미한다.

SELECT *
FROM wine
WHERE name = 'wineName'
LIMIT 10;

 

 

🤔 어떻게 활용할까?

QueryDslSupport를 이용하여 매우 간단하게 SQL 쿼리 문을 작성할 수 있게 되었다.

📓 오늘의 한줄

"We must accept finite disappointment, but never lose infinite hope."

-사 Martin Luther King Jr. -