QueryDSL의 진짜 장점은,
쿼리를 자바 코드로 읽고 쓸 수 있다는 점이다.
이번 장에서는 QueryDSL로 검색 조건 쿼리(where) 를 작성하는 방법을 알아볼 것이다.
1) 기본 준비 — QueryFactory 생성
QueryDSL은 JPAQueryFactory를 통해 쿼리를 작성한다.
즉, JPA의 EntityManager를 기반으로 동작하기 때문에
아래와 같이 QueryFactory를 초기화해야 한다.
@Autowired
EntityManager em;
JPAQueryFactory queryFactory;
@BeforeEach
void before() {
queryFactory = new JPAQueryFactory(em);
}
이 한 줄이 있어야 이후 모든 QueryDSL 코드가 동작한다.
2) 예제 1 — 기본 where 조건 쿼리
@Test
public void search() {
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1")
.and(member.age.eq(10)))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
여기서 member는 QMember member = QMember.member; 로 선언된 Q타입이다.
JPQL로 작성하면 이렇게 된다.
select m
from Member m
where m.username = 'member1' and m.age = 10
SQL을 아는 사람이라면 QueryDSL 코드도 자연스럽게 “읽히는” 형태라는 걸 느낄 수 있다.
2) 예제 2 — where 조건 여러 개를 쉼표(,)로 구분하기
QueryDSL에서는 .and() 대신 쉼표로 조건을 나열할 수 있다.
이 방식이 훨씬 깔끔해서 많이 사용된다고 한다.
@Test
public void search() {
Member findMember = queryFactory
.selectFrom(member)
.where(
member.username.eq("member1"),
member.age.eq(10)
)
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
assertThat(findMember.getAge()).isEqualTo(10);
}
where() 안에 여러 조건을 넣으면 내부적으로 모두 AND 조건으로 묶인다.
또한, null을 안전하게 무시하기 때문에
동적 쿼리 작성 시에도 아주 유용하다.
마무리하며
JPQL은 문자열로 쿼리를 작성하기 때문에
오타, 컬럼명 변경, 런타임 오류에 취약하다.
QueryDSL은 이런 문제를 자바 코드로 해결한다.
- 쿼리가 IDE에서 “읽히고”
- 자동완성이 되고
- 컴파일 시점에서 오류를 잡는다.
복잡한 쿼리일수록 QueryDSL의 진가가 드러난다.
SQL을 읽듯이 자바 코드를 읽을 수 있다.
감사합니다.
'QueryDSL' 카테고리의 다른 글
| [QueryDSL] 정렬과 페이징 (0) | 2025.10.26 |
|---|---|
| [QueryDSL] 결과 조회 (0) | 2025.10.26 |
| [QueryDSL] QueryDSL과 빠른 세팅 방법 (0) | 2025.10.26 |
