우리는 Spring Data Jpa를 이용해 여러 방법으로 쉽게 쿼리를 만들고 작동시킬 수 있었다.
쿼리가 복잡해질 경우 @Query
와 같은 어노테이션으로 쿼리를 직접 작성할 수 있다.
하지만 이렇게 되면 쿼리에 문제가 있는지 여부를 런타임시에 알 수밖에 없다.
이런 문제를 극복하기 위해 쿼리를 코드로 작성하는 QueryDsl을 이용할 수 있다.
QueryDsl은 spring data jpa와 달리 코드로 쿼리를 짜기 때문에 컴파일 시점에 쿼리에 문제가 있는지 여부를 알 수 있다.
querydsl은 스프링 스타터에서 추가할 수 없기 때문에 별도로 build.gradle
에 관련 라이브러리를 넣어주어야 한다.
plugins {
...
// querydsl
id 'com.ewerk.gradle.plugins.querydsl' version "1.0.10"
}
...
dependencies {
...
implementation 'com.querydsl:querydsl-jpa'
}
// 쿼리 dsl 설정 시작
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
먼저 plugins
에 querydsl 버전을 설정해주고 dependencies
에 라이브러리를 추가해준다.
그 후 querydsl 관련 세부 설정을 적어줘야 하는데 대략적인 내용은 이렇다.
def querydslDir = "$buildDir/generated/querydsl"
에 설정해준다. 먼저 테스트를 할 엔티티를 하나 만든다.
이 엔티티를 Qclass로 만들기 위해 querydsl을 컴파일해야 하는데 두가지 방법이 있다.
querydsl
->Tasks
-> others
-> complieQuerydsl
을 더블클릭./gradlew compileQuerydsl
입력빌드를 완료하면 전에 설정해 둔 경로 아래에 엔티티 경로와 같은 경로로 Qclass가 생성된다.
여기서 Qclass는 버전에 따라 세부 내용이 바뀔 수 있기 때문에 .gitignore
에 추가하는 방법 등으로 커밋 내용에서 제외해야 한다.
위와 같이 간단한 테스트를 작성해 보았다.
em.persist
로 member 저장JPAQueryFactory
에 EntityManager
전달QMember
생성 시 alias를 m
으로 설정QMember
에서 하나 가져오는 쿼리 작성결과를 보면 저장한 member와 같은 결과가 나온 것을 볼 수 있다.
실제 쿼리는 아래와 같다.
querydsl 라이브러리를 추가하면 querydsl-jpa
와 querydsl-apt
가 추가된다.