본문 바로가기
Back-End/Spring

TIL 230801 : QueryDSL 쓰려고 정리하는 배경지식들 (Predicate)

by 우인입니다 2023. 8. 2.

동적 쿼리

무조건 name만 가지고 조회하는 쿼리는 정적이다.

하지만 name이 아니라 age도 같이 조건으로 user를 조회하는 쿼리가 온다면?

아니면 아예 age만 조건으로 받는다면?

 

순간순간 다른 경우에 대응할 수 있게 그에 따른 쿼리가 만들어질 수 있게 하는게 동적쿼리라고 이해된다.

 

https://ssdragon.tistory.com/91

https://tecoble.techcourse.co.kr/post/2022-10-11-jpa-dynamic-query/

위 링크에서 소개되어 있는데, 동적쿼리를 쓰는 몇가지방법이 있는데 그중 하나가 QueryDSL이다.

  • JPQL
  • JPA Criteria
  • QueryDSL
  • 네이티브 SQL
  • JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용

 

 

 

JPQL

자바에서 쓰는 쿼리문. Hibernate에서 이를 주석처리해서 보여주고 실제 쿼리는 이와는 조금 다르다.

 

JPQL 자바에서 쓰는 쿼리문 묠니르묘묘님 블로그에서 가져왔습니다.

 

@Query, @NamedQuery

직접 쿼리문을 사용할 수 있다.

  @Query("SELECT u, u.password AS customField FROM User u WHERE u.username = ?1")
  List<User> findByUsernameWithCustomField(String username, Sort sort);

 

하지만 이렇게 직접 문자열로 쿼리를 작성하게 되면 위험하다.

오타에 취약하고 IDE선에서 컴파일에러를 검사할 수 없기 때문이다.

 

 

 

 

 

QueryDSL

 

QueryDsl은 라이브러리이다. 쿼리를 자바에서 코드형태로 만들 수 있게 해준다. 이로써 Type-Safe하게 쿼리를 작성할 수 있고, 동적쿼리 또한 가능하다.

 

 

 

QueryPredicateExecutor

https://keencho.github.io/posts/spring-data-jpa-custom-querydsl-repository/

public interface PostRepository extends JpaRepository<Post, Long>, QuerydslPredicateExecutor<Post> {

}

위처럼 기존 JpaRepository를 상속받는 형태에 QuerydslPredicateExecutor를 추가로 상속하여 QueryDsl을 사용할 수 있다.

 

다양한 조건들을 여러개 만들어두고 조합하여 사용할 수 있는 장점이 있지만, Join이 필요한 경우 사용할 수 없다.

현업에서는 JPAQueryFactory를 많이 사용한다고 한다.

 

 

 

+Predicate

이 인터페이스가 QueryDsl을 위한 인터페이스인줄 알았는 데, 원래 있던 인터페이스였다.

https://developer-talk.tistory.com/722

 

predicate는 서술어라는 뜻인데, 쿼리를 목적어와 서술어부분으로 나누어서 개념적으로 생각했을 때 여러가지 서술어를 통해 쿼리를 만들 수 있게 도와준다.

and, or, isEqual 과 같은 메소드를 내부에 가지고 있다.

 

 

 

 


이어서 공부할 것들

JPAQueryFactory를 활용하기

Predicate구조?

BooleanBuilder?

Q객체

 

https://mvmvm.tistory.com/122?category=957558 

 

 


갑자기 많은 개념들이 쏟아져 나와서 섞였는데,
정리가 조금씩 되어간다.

QueryDsl은 라이브러리이고, Predicate라는 기존의 인터페이스를 활용할 수도 있다.
하지만 현업에서 자주 사용하는 방식은 JPAQueryFactory이다.
다음 시간에는 이를 통한 쿼리작성법을 정리해보겠다.