이번에 방학동안 프로젝트를 하면서 제일 큰 문제가 동적쿼리를 처리하는 부분이었습니다.
동적 쿼리는 주로 조건에 따라 WHERE 절의 일부가 필요한 경우나 정렬 순서를 동적으로 결정해야 하는 경우 등에 사용됩니다. 예를 들어, 사용자가 웹 애플리케이션에서 검색 조건을 입력한 경우, 그 조건에 따라 데이터베이스에 쿼리를 보내야 합니다. 이때 동적 쿼리를 사용하여 해당 조건을 반영한 쿼리를 생성하고 실행할 수 있습니다.
이 부분을 손쉽게 해결해 줄 수 있는게 Querydsl이라고 합니다.
그래서 김영한 강사님의 실전! Querydsl을 듣고 공부해보기로 했습니다!!
Querydsl 세팅
저는 스프링부트 3.1.3 을 사용하였고 자바는 17을 사용했습니다.
스프링부트 3 이후는 Querydsl 세팅하는 법이 달라졌다고 합니다. 그래서 구글링도 하고 강의도 들으면서 세팅을 완료했습니다.
plugin을 사용하지 않습니다.
- 3.0 밑에는 plugin을 사용했지만 3.0 이후로는 plugin을 사용하지 않는다고 합니다.
Dependencies 추가
//Querydsl 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
Q타입 생성
- Querydsl은 Q타입을 생성해서 쓴다고 합니다.
Q타입이란?
Q타입(Query Type)은 QueryDSL이 엔티티 클래스를 기반으로 생성하는 클래스로, 엔티티 클래스의 필드와 속성을 메타데이터로 가지고 있습니다.
Q타입은 엔티티 클래스의 각 필드를 자동으로 조회할 수 있는 메소드를 제공하며, QueryDSL을 사용하여 타입 안전한 쿼리를 작성할 때 사용됩니다. 간단히 말해서, QueryDSL을 사용하여 쿼리를 작성하면 Q타입을 활용하여 엔티티의 속성에 접근하고 조건을 지정할 수 있습니다.
def querydslSrcDir = 'src/main/generated'
clean {
delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
- def querydslSrcDir = 'src/main/generated': QueryDSL이 생성한 Q타입 클래스들을 저장할 디렉토리 경로를 정의합니다.
- clean { delete file(querydslSrcDir) }: Gradle의 clean 태스크를 확장하여, 빌드 시에 해당 디렉토리를 삭제하는 작업을 수행합니다. 이렇게 함으로써 이전에 생성된 Q타입 클래스들을 지우고 새로 생성될 수 있도록 합니다.
- tasks.withType(JavaCompile) { options.generatedSourceOutputDirectory = file(querydslSrcDir) }: JavaCompile 태스크에 대해 옵션을 설정합니다. 이 설정을 통해 Q타입 클래스들이 생성된 후에 해당 디렉토리에 저장되도록 합니다. 이렇게 함으로써 Gradle은 컴파일 시에 QueryDSL에 의해 생성된 Q타입 클래스들을 찾아 지정된 디렉토리에 저장합니다.

이렇게 Q타입이 생성이 완료됩니다. 이 파일은 Git에 안올라가는게 좋기 때문에 .gitignore에 추가했습니다.
Q타입 테스트 해보기
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello);
JPAQueryFactory query = new JPAQueryFactory(em);
QHello qHello = QHello.hello; //Querydsl Q타입 동작 확인
Hello result = query
.selectFrom(qHello)
.fetchOne();
Assertions.assertThat(result).isEqualTo(hello);
//lombok 동작 확인 (hello.getId())
Assertions.assertThat(result.getId()).isEqualTo(hello.getId());
}

QHello를 잘 사용하는 모습을 볼 수 있습니다!!
출처
https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84/dashboard
실전! Querydsl - 인프런 | 강의
Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, 복잡한 쿼리, 동적 쿼리는 이제 안녕! Querydsl로 자바 백엔드 기술을 단단하게. 🚩 본 강의는 로드맵 과정입니다. 본 강의는 자바 백엔
www.inflearn.com
'BackEnd > Querydsl' 카테고리의 다른 글
Querydsl 기본 문법 (정렬, 페이징, 집합) (1) | 2023.08.28 |
---|---|
Querydsl 기본 문법 (검색, 결과) (0) | 2023.08.28 |
JPQL과 Querydsl에 차이 (0) | 2023.08.28 |