QueryDSL 이란 ?

mallin·2022년 10월 10일
1

QueryDSL

목록 보기
1/2
post-thumbnail

QueryDSL 은 한마디로 SQL, JPQL 등을 코드로 작성할 수 있도록 해주는 ✨빌더 오픈소스 프레임워크✨ 다.

사실, QueryDSL 이 JPA 에서만 사용하는 프레임워크로만 알 수도 있지만

공식 사이트 를 보면 JPA 뿐만 아니라 SQL, Mongodb, Lucenece 등 다양한 언어에 대해서 서비스를 제공한다.

이번엔 JPA 를 사용할 때 함께 많이 사용하는 QueryDSL JPA 에 대해서 알아보자

QueryDSL JPA

QueryDSL JPA 는

① SQL, JPQL 을 코드로 작성할 수 있도록 해주는 빌더 API 이고,
② Entity 클래스와 매핑되는 QClass 라는 객체를 사용해서 쿼리를 실행한다.

위에 설명을 읽다 보니깐 JPQL 이란 QClass 라는 키워드가 눈에 밝히는데 해당 단어들이 무엇을 의미하는 걸까 ?

QClass 란 ?

QueryDSL 은 컴파일 단계에서 엔티티를 기반으로 QClass 를 생성하는데 JPAAnnotationProcessor 가 컴파일 시점에 작동해서 @Entity 등등의 어노테이션을 찾아 해당 파일들을 분석해서 QClass 를 만든다.

QClass 는 Entity 와 형태가 똑같은 Static Class 이다.
QueryDSL 은 쿼리를 작성할 때 QClass 를 기반으로 쿼리를 실행한다.

JPQL 이란 ?

JPA 에서 지원하는 다양한 쿼리 방법 중 가장 단순한 조회 방법으로, SQL 의 경우에는 DB 테이블을 대상으로 쿼리를 질의하지만, JPQL 은 엔티티 객체를 대상으로 쿼리를 질의한다.

EX)

String jpql = “select m From Member m where m.name like ‘%hello%’”;
List<Member> result = em.createQuery(jpql, Member.class).getResultList();

(SQL 로 변환시) select * from members where name like ‘%hello%’;

위 설명만 봤을 때에는
굳이 QueryDSL JPA 를 사용해야 하나 ? 그냥 JPQL 을 사용하면 안되나 ? 라는 생각이
들수 있다.

하지만, JPQL 에는 문제점이 존재한다.

JPQL 의 문제점

① 쿼리를 여전히 문자열로 입력한다.
-> 오타가 발생하거나 관리하는데 있어서 어려움이 따르고, type-check 가 불가능하다

② 컴파일 단계에서 오류를 확인할 수 없고, 런타임에서 해당 쿼리가 실행되어야 오류를 발견할 수 있다.
-> 테스트 코드를 짜면 불안을 덜 수 있긴 하지만, 실제 프로그램을 운영하면서 오류가 발생할 수도 있다는 부담이 너무 커진다.

QueryDSL JPA 는 JPQL 이 가지고 있는 문제점들을 해결해준다.

QueryDSL JPA 를 사용해야 하는 이유

① 쿼리를 여전히 문자열로 입력하기 때문에 오타가 발생하거나 관리하기 어렵다.
➡️ QueryDSL 은 쿼리를 문자열로서가 아니라 코드를 통해서 작성하기 때문에 오타가 날 확률이 적어지고, 객체 지향적으로 개발할 수 있다.

② 컴파일 단계에서 오류를 확인할 수 없고, 런타임 시 해당 쿼리가 실행되어야지만 오류를 확인할 수 있다.
➡️ QueryDSL 은 코드로서 작성하기 때문에 컴파일 단계에서도 오류를 빠르게 발견할 수 있다.

예를 들어서
회원(member) 와 포인트(point) 를 조인해서 가져와야 할 때
JPQL 의 경우에는

String jpql = "select * from Member m join Point p on p.member_id = m.id"
List<Member> result = em.createQuery(jpql, Member.class).getResultList();

이런식으로 쿼리를 작성해야 하지만,
QueryDSL 을 사용했을 때에는

return jpaQueryFactory
.from(member)
.join(member.point, point)
.fetch();

이런 식으로 코드를 사용해서 나타낼 수 있다.
오타가 나더라도 컴파일 단계에서 오류를 확인 할 수 있고, 코드로서 작성하기 때문에 더욱 객체 지향적으로 개발할 수 있다.

이러한 이유로 spring 에서 JPA 를 사용할 때 QueryDSL JPA 를 보통 함께 사용한다.
그러면 지금까지 QueryDSL 에 대해서 한 번 맛봤으니 다음 포스팅에서는 QueryDSL 을 어떻게 사용하면 되는지 알아보자.

0개의 댓글