서론 (Introduction)

QueryDSL은 ORM을 사용하다 보면 언젠가는 사용하게 될 기술 중 하나입니다. 이를 설정하는 법을 구글링해보면 표준적인 설정 방법이 없기 때문에 각기 다른 방법을 제시하고 그만큼 설정에 에러를 많이 겪는 경우가 보입니다. 여기에서는 자바 버전에 따라 가장 간단하게 QueryDSL을 설정하는 방법을 알아보고, 각 설정의 의미에 대해서 서술해보도록 하겠습니다.

본문 (Body)


간단한 QueryDSL 원리

설정에 대해 알아보기전, 간단하게 QueryDSL의 원리에 대해 알면 설정을 이해하기 쉽습니다. 만약, 빠르게 설정만 하고 싶다면 아래 (QueryDSL 설정)를 바로 참고하시기 바랍니다.

 

QueryDSL은 "쿼리를 안전하고 쉽게 하기 위한 도메인 특화언어(DSL, Domain Specific Language)"입니다. 이를 위해선, 기존 자바코드를 바탕으로 JPA, MongoDB 같은 도메인에 맞는 언어를 생성하는 과정이 필요합니다. QueryDSL은 다음 과정을 통해 도메인 언어를 생성합니다.

 

1. compileJava 태스크를 실행합니다.

2. @Entity와 같이 쿼리와 관련된 어노테이션과 클래스를 스캔합니다.

3. 스캔한 클래스를 활용해 도메인에 맞는 언어를 생성합니다. (ex. Student.class ->  QStudent.class)

 

이제 개발자는 QueryDSL이 생성한 언어를 이용해 자바언어를 토대로 쿼리를 작성할 수 있습니다.


QueryDSL 설정

QueryDSL은 다음 코드를 build.gradle 파일에 추가해 설정할 수 있습니다.

dependencies{
    //Java EE를 사용하는 경우, (javax 패키지를 참조할 수 있는 경우)
    implementation 'com.querydsl:querydsl-jpa:5.0.0'
    annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa'
    annotationProcessor 'javax.persistence:javax.persistence-api:2.2.0'

    
    //Jakarta EE를 사용하는 경우, (jakarta 패키지를 참조할 수 있는 경우)
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api:3.1.0'
    
 }
 
 ...
 
 task deleteGenerated(type: Delete) {
    delete "src/main/generated"
}

clean.dependsOn deleteGenerated

 

각 설정의 이유에 대해서 설명해보겠습니다. 

 

먼저, 아래 의존성은 queryDSL에서 쿼리 기능을 구현하는데 필요한 클래스를 불러오기 위해 사용됩니다.

jakarta 의 경우 기존에 javax.persistence.* 로 선언된 패키지들이  jakarta.persistence.* 로 변경되었기 때문에, 올바른 참조를 위해 추가로 선언한 필요가 있습니다.

implementation 'com.querydsl:querydsl-jpa:5.0.0'

annotationProcessor는 Gradle에서 컴파일 타임에 어노테이션을 처리해 코드를 생성 또는 검증하는데 사용하기 위한 키워드입니다. APT는 Annotation Processing Tool의 약자입니다. 즉, querydsl에서 어노테이션 처리를 위한 기능을 가져오기 위해 사용됩니다.

이 또한, jakarta 의 경우 기존에 javax.persistence.* 로 선언된 패키지들이  jakarta.persistence.* 로 변경되었기 때문에, 올바른 참조를 위해 추가로 선언한 필요가 있습니다.

annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa'

@Entity와 같은 기본 어노테이션들은 자바에서 표준적으로 정의되어 있습니다. 따라서 각 환경에 따라 필요한 정의를 annotationProcessor를 사용해 정의할 필요가 있습니다.

 

annotationProcessor 'javax.persistence:javax.persistence-api:2.2.0'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api:3.1.0'


QueryDSL 사용

위 설정이 올바르게 완료되면, compileJava 라는 태스크를 실행할 수 있습니다. ./gradlew compileJava 커맨드를 이용해 태스크를 실행하면, 위에서 설명한 DSL 생성과정이 진행됩니다.

2. @Entity와 같이 쿼리와 관련된 어노테이션과 클래스를 스캔합니다.
3. 스캔한 클래스를 활용해 도메인에 맞는 언어를 생성합니다. (ex. Student.class ->  QStudent.class)

그럼 이제 queryDSL 문법에 따라 설정이 가능합니다!

 

 

+ Recent posts