JPA

QueryDSL이란?

Junuuu 2023. 2. 1. 00:01
728x90

공식 페이지부터 첨부하고 시작하겠습니다.

http://querydsl.com

 

Querydsl - Unified Queries for Java

Unified Queries for Java. Querydsl is compact, safe and easy to learn. <!-- Querydsl Unified Queries for Java Querydsl provides a unified querying layer for multiple backends in Java. Compared to the alternatives Querydsl is more compact, safer and easier

querydsl.com

 

개요

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/

 

Spring Boot에 QueryDSL을 사용해보자

1. QueryDSL PostRepository.java Spring Data JPA가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL…

tecoble.techcourse.co.kr

https://jessyt.tistory.com/7

 

Spring Data JPA 기반 Querydsl란?

이제서야 적용해본다 Querydsl!! 기존 프로젝트에서는 mybatis를 사용했다. mybatis는 Mapper.java, mapper.xml 파일을 만들어 namespace로 연결하여 사용하는 방식이었다. 개발자1로써 크게 불편함을 느끼지 않

jessyt.tistory.com