우리는 Spring Data Jpa를 이용해 여러 방법으로 쉽게 쿼리를 만들고 작동시킬 수 있었다.
쿼리가 복잡해질 경우 @Query와 같은 어노테이션으로 쿼리를 직접 작성할 수 있다.
하지만 이렇게 되면 쿼리에 문제가 있는지 여부를 런타임시에 알 수밖에 없다.
이런 문제를 극복하기 위해 쿼리를 코드로 작성하는 QueryDsl을 이용할 수 있다.
QueryDsl은 spring data jpa와 달리 코드로 쿼리를 짜기 때문에 컴파일 시점에 쿼리에 문제가 있는지 여부를 알 수 있다.
Querydsl 설정
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 관련 세부 설정을 적어줘야 하는데 대략적인 내용은 이렇다.
- querydsl은 엔티티를 기반으로 Qclass를 자동으로 만들어 사용한다
- Qclass를 만들어 줄 경로를 def querydslDir = "$buildDir/generated/querydsl"에 설정해준다.
기본 예제
먼저 테스트를 할 엔티티를 하나 만든다.
이 엔티티를 Qclass로 만들기 위해 querydsl을 컴파일해야 하는데 두가지 방법이 있다.
- 오른쪽 탭 중 gradle에서 querydsl->Tasks -> others -> complieQuerydsl을 더블클릭
- 터미널에서 ./gradlew compileQuerydsl 입력
빌드를 완료하면 전에 설정해 둔 경로 아래에 엔티티 경로와 같은 경로로 Qclass가 생성된다.
여기서 Qclass는 버전에 따라 세부 내용이 바뀔 수 있기 때문에 .gitignore에 추가하는 방법 등으로 커밋 내용에서 제외해야 한다.
위와 같이 간단한 테스트를 작성해 보았다.
- em.persist로 member 저장
- 쿼리를 작성하기 위한 JPAQueryFactory에 EntityManager 전달
- QMember 생성 시 alias를 m으로 설정
- QMember에서 하나 가져오는 쿼리 작성
결과를 보면 저장한 member와 같은 결과가 나온 것을 볼 수 있다.
실제 쿼리는 아래와 같다.
라이브러리 살펴보기
querydsl 라이브러리를 추가하면 querydsl-jpa와 querydsl-apt가 추가된다.
- querydsl-apt: Qclass를 만드는 데에 사용
- querydsl-jpa: 쿼리를 작성하는데에 사용
'Spring' 카테고리의 다른 글
QClass 사용법 (0) | 2023.02.10 |
---|---|
QueryDsl 도메인 생성 (0) | 2023.02.10 |
ModelMapper (0) | 2023.02.06 |
NPM으로 프론트엔드 라이브러리 관리 (0) | 2023.02.06 |
@Validation (0) | 2023.02.06 |