QueryDSL이란?
공식 페이지부터 첨부하고 시작하겠습니다.
개요
QueryDSL을 사용하기에 앞서 QueryDSL은 어떤 것인지 어떻게 동작하는지 먼저 알아보고자 합니다.
QueryDSL이란?
오픈소스 프로젝트로 JPQL을 Java코드로 작성할 수 있게 도와주는 라이브러리입니다.
JPQL이 잇는데 QueryDSL이 등장한 이유?
이야기에 앞서 JPQL을 예시코드를 보겠습니다.
@Query("select p from Post p join fetch p.user u "
+ "where u in "
+ "(select t from Follow f inner join f.target t on f.source = :user) "
+ "or u = :user "
+ "order by p .createdAt desc")
List<Post> findAllAssociatedPostsByUser(@Param("user") User user, Pageable pageable);
JPQL은 어떤 단점들이 있을까요?
1. 긴 문자열에 오타 혹은 문법적인 오류가 존재하는 경우 정적 쿼리라면 애플리케이션 로딩 시점에 이를 발견할 수 있으나 그 외는 런타임 시점에 에러가 발생합니다.
2. 자동 완성 등 IDE의 도움을 받을 수 없다.
3. 동적인 쿼리 작성이 어렵다.
이를 극복하는 QueryDSL
1. 컴파일 시점에 오류를 쉽게 확인할 수 있다.
2. 자동 완성 등 IDE의 도움을 받을 수 있다.
3. 동적인 쿼리 작성이 편리하다.
동작원리
1. Table 별로 Entity를 생성합니다.
2.QueryDSL은 프로젝트 내의 @Entity 어노테이션을 선언한 클래스를 탐색하고, JPAAnnotationProcessor를 사용하여 prefix "Q"가 붙는 큐클래스가 생성됩니다.
(예시 : Store -> QStore)
3. 생성된 큐클래스를 사용하여 type-safe 한 querydsl을 생성합니다.
4. querydsl을 실행하면 내부에서 JPQL을 생성합니다.
5. SQL을 생성하여 Database에 직접 쿼리를 사용하여 조회합니다.
(QueryDSL -> JPQL -> SQL)
간단한 QueryDSL 예시
List<Person> persons = queryFactory.selectFrom(person)
.where(
person.firstName.eq("John"),
person.lastName.eq("Doe"))
.fetch();
person이라는 table에서 firstName 칼럼이 John, lastName 칼럼이 Doe인 사람을 조회하여 가져오는 SQL인 것을 빠르게 파악할 수 있습니다.
참고자료
https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/