QueryDSL은 SQL, JPQL 등을 코드로 작성할 수 있도록 해주는 ✨빌더 오픈소스 프레임워크✨ 이다.
사실, QueryDSL 이 JPA 에서만 사용하는 프레임워크로만 알 수도 있지만, JPA 뿐만 아닌 다양한 언어에 대해서도 서비스를 제공한다.
QueryDSL JPA
QueryDSL은 하이버네이트 쿼리 언어(HQL)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다.
자바 백엔드 기술은 Spring Boot와 Spring Data JPA를 함께 사용한다. 하지만, 복잡한 쿼리, 동적 쿼리를 구현하는 데 있어 한계가 있다. 이러한 문제점을 해결하기 위해 사용하는 것이 QueryDSL이다.
QueryDSL이 등장하기 전에는 Mybatis, JPQL, Criteria 등 문자열 형태로 쿼리문을 작성해, 컴파일 시에 오류를 발견하는게 불가능했다.
이전에는 어떻게 사용했길래 컴파일 시점에 오류를 찾는게 불가능한지 살펴보자.
JPQL 이란 ?
JPA 에서 지원하는 다양한 쿼리 방법 중 가장 단순한 조회 방법으로, SQL 의 경우에는 DB 테이블을 대상으로 쿼리를 질의하지만, JPQL 은 엔티티 객체를 대상으로 쿼리를 질의한다.
String jpql = “select m from Member m where m.name = :username”;
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
이렇게만 봤을 때는 그냥 JPQL을 사용하는게 더 간단해보일 수 있지만, JPQL에는 다음과 같은 문제점이 존재한다.
JPQL 문제점
- 쿼리를 문자열로 입력한다.
→ 오타가 발생하거나, 관리하는데 어려움이 있고, type-check가 불가능하다. - 컴파일 단계에서 오류를 확인할 수 없고 런타임에서 해당 쿼리가 실행되어야 오류를 발견할 수 있다.
QueryDSL은 자바 코드로 SQL문을 작성할 수 있어 컴파일 시에 오류를 발생하여 잘못된 쿼리가 실행되는 것을 방지할 수 있다.
QueryDSL 를 사용해야하는 이유
- 쿼리를 문자열로서가 아니라 코드를 통해서 작성하기 때문에 오타가 날 확률이 적어지고, 객체 지향적으로 개발할 수 있다.
- QueryDSL 은 코드로서 작성하기 때문에 컴파일 단계에서도 오류를 빠르게 발견할 수 있다.
- 복잡한 쿼리나 동적 쿼리 작성이 편리하다.
- 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.
예를 들어, 위의 예시를 다시 가져와보자.
JPQL 의 경우에는
String jpql = “select m from Member m where m.name = :username”;
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
이런식으로 쿼리를 작성해야 하지만,
QueryDSL 을 사용했을 때에는
String username = "java";
List<Member> result = queryFactory
.select(member)
.from(member)
.where(usernameEq(username))
.fetch();
이런 식으로 코드를 사용해서 나타낼 수 있다.