원래 하던 프로젝트를 그만두고 다른 프로젝트에 중간에 참여하게 되었다.
프로젝트 온보딩을 하는 과정에서 QueryDSL이 구현된 부분이 있었고, 그 부분을 나름 코드만 보고 이해했었다고 생각했지만, 내 착각이었다.. 그래서 QueryDSL에 대한 기초를 알아보고자 한다!
QueryDLS 이란?
QueryDSL은 Java 언어를 기반으로 데이터베이스 쿼리를 생성하는 데 사용되는 도메인 특화 언어이다.
이것은 데이터베이스와 상호 작용할 때 SQL 쿼리를 문자열로 작성하는 대신 Java 코드로 쿼리를 작성할 수 있게 해준다.
QueryDLS의 장점
QueryDSL의 장점은 크게 4가지 이다.
QueryDSL을 사용해야 할까?
QueryDSL을 무조건 사용해야 한다는 건 아니다.
다만 몇가지의 요소를 생각해보고 사용해야 할지 여부를 정해야한다.
만약 어플리케이션에서 복잡하고 동적인 쿼리를 자주 실행해야 한다면, QueryDSL을 사용하는 것이 좋다.
정적 SQL 쿼리만으로는 요구 사항을 충족하기 어려울 때 QueryDSL을 사용하여 동적 쿼리를 생성하고 실행할 수 있다.
QueryDSL은 타입 안정성을 제공하며, 컴파일 타임에 오류를 검출할 수 있도록 도와준다.
프로젝트의 규모와 요구 사항에 따라 달라질 수 있다.
작은 프로젝트나 단순한 데이터베이스 상호 작용이라면 정적 SQL 쿼리만으로 충분할 수 있다.
그러나 대규모 프로젝트나 복잡한 데이터베이스 작업에서는 QueryDSL의 이점을 활용하기 좋다.
JPQL과 QueryDSL
JPQL
String username = "HongGilDong";
String jqpl = 'select m from Member m where m.username = :username";
List<Member> result = em.createQuery(jpql, Member.class)
.setParameter("username", username)
.getResultList();
QueryDSL
String username = "HongGilDong";
List<Member> result = queryFactory
.selectFrom(member)
.where(member.username.eq(username))
.fetch();
문법
타입 안전성*
가독성
QueryDSL 기본 문법
Q클래스
Q클래스 예시
import com.querydsl.core.types.dsl.*;
public class QUser extends EntityPathBase<User> {
private static final long serialVersionUID = 1L;
public static final QUser user = new QUser("user");
public final NumberPath<Long> id = createNumber("id", Long.class);
public final StringPath username = createString("username");
public final StringPath email = createString("email");
public QUser(String variable) {
super(User.class, forVariable(variable));
}
}