Spring Data JPA만으로도 대부분의 서비스는 충분하다.
간단한 CRUD나 단순 조회 쿼리는 메서드 이름만으로 금방 해결된다.
하지만 조금만 복잡해지면 상황이 달라진다.
조건이 여러 개인 동적 쿼리,
여러 테이블을 엮는 복잡한 조인,
필요한 필드만 조회하는 프로젝션,
그리고 성능을 위한 페치 조인까지 들어가면
문자열 기반 JPQL은 한계가 금방 드러난다.
이럴 때 필요한 것이 바로 QueryDSL이다.
QueryDSL은 컴파일 시점에 오류를 잡아주는 타입 안전 쿼리 빌더로,
IDE 자동완성과 높은 가독성을 제공한다.
즉, 복잡한 조건도 안전하고 깔끔하게 작성할 수 있다.
따라서 오늘은 QueryDSL을 빠르게 세팅하는 방법에 대해 알아볼 것이다.
1. build.gradle 설정
먼저 build.gradle 파일에 아래 내용을 추가한다.
// QueryDSL
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
Spring Boot 3.x 이상에서는 반드시 jakarta 버전을 사용해야 한다.
예전의 javax 패키지는 이제 더 이상 호환되지 않는다.
간단한 엔티티 예제
@Entity
@Getter @Setter
public class Hello {
@Id @GeneratedValue
private Long id;
}
반드시 엔티티 하나 이상이 존재해야 한다.
위 방식으로 설정 한뒤 Grade을 빌드 하면 다음과 같이 Q파일이 생긴다.

2. Q클래스가 생성되지 않는다면?
정상적으로 세팅됐다면 build/generated/.../QHello.java 파일이 생긴다.
하지만 가끔 Q파일이 안 만들어질 때가 있다.
그럴 땐 터미널에서 아래 명령어를 직접 실행하자.
./gradlew clean compileJava --info
이 명령은 Annotation Processor를 강제로 실행시켜
Q클래스를 직접 생성한다.
3. 테스트 코드로 확인
@SpringBootTest
@Transactional
class QuerydslApplicationTests {
@Autowired EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello);
JPAQueryFactory query = new JPAQueryFactory(em);
QHello qHello = QHello.hello;
Hello result = query.selectFrom(qHello).fetchOne();
Assertions.assertThat(result).isEqualTo(hello);
Assertions.assertThat(result.getId()).isEqualTo(hello.getId());
}
}
테스트가 정상 통과되면, QueryDSL이 잘 세팅된 것이다.
마무리하며:
Spring Data JPA만으로도 단순한 CRUD는 충분하다.
하지만 프로젝트가 커지고, 복잡한 조건이 늘어나면
문자열 기반 쿼리는 금방 한계를 드러낸다.
이럴 때 QueryDSL을 사용하면
타입 안정성, 자동완성, 가독성을 모두 잡을 수 있다.
단순한 건 JPA로, 복잡한 건 QueryDSL로.
이것이 현시점에서 가장 실용적이고 안정적인 조합이다.
감사합니다.
'QueryDSL' 카테고리의 다른 글
| [QueryDSL] 정렬과 페이징 (0) | 2025.10.26 |
|---|---|
| [QueryDSL] 결과 조회 (0) | 2025.10.26 |
| [QueryDSL] 검색 조건 쿼리 (0) | 2025.10.26 |
