JPQL VS QueryDSL VS 쿼리메소드

정민주·2024년 2월 29일

스프링 스터디

목록 보기
6/17

JPQL(Java Persistence Query Language), QueryDSL, 그리고 쿼리 메소드는 모두 데이터베이스로부터 데이터를 조회하는 방법이지만, 각각의 특성과 사용 방법에는 차이점이 있습니다.

⭐ 1. JPA(Query Method) 쿼리 메소드

Spring Data JPA에서 제공하는 기능으로, 메소드 이름만으로 JPQL을 생성하고 실행하는 방법입니다.

즉 사용하려는 Repository에 JpaRepostory만 상속해주면 구현까지 자동으로 해줍니다.

형태 : find + ("객체") + By + "변수"

예제코드

1.1 장점

  • 메소드 이름을 통해 '어떤 엔티티를 어떻게 조회할 것인지'를 명시하므로, 간단한 쿼리의 경우 코드를 간결하게 작성할 수 있습니다.

1.2 단점

  • 복잡한 쿼리의 경우 메소드 이름이 길어지거나 구현이 어렵습니다.

⭐ 2. JPQL (Java Persistence Query Language)

데이터베이스의 테이블을 대상으로 하는 sql과 달리, JPQL은 자바 클래스와 그 속성(필드)를 대상으로 쿼리를 작성한다.

즉, 데이터베이스에 직접 접근하는 것이 아니라 엔티티 객체를 대상으로 쿼리를 작성한다.


엔티티 객체를 대상으로 쿼리를 작성한다?

말이 너무 어려운 것 같아 찾아보았다!
jpql vs sql?


예제코드

검색어 기능을 위해 구현되었던 코드들이다.

1) 첫 번째 쿼리문은 roadAddress 필드에 주어진 키워드가 포함된 ChildCenter 엔티티를 검색할 수 있다.
2) 두 번째 쿼리문은 centerName 필드에 주어진 키워드가 포함된 ChildCenter 엔티티를 검색하는 쿼리이다.

2-1. 장점

  • sql을 추상화해서 사용하기에, 어떤 db를 사용하던 문법이 달라질 일이 없다.
  • 복잡한 조건을 jpa의 메서드로 표현하기엔 어려울 수 있기에 jpql을 사용해 직접 쿼리문을 작성할 수 있다.

2-2. 단점

  • 여러 조인이나 복잡한 쿼리를 작성할 때는 마찬가지 코드가 길어지기에 복잡해진다.
  • 직접 쿼리문을 문자열로 작성하기에 오타로 인한 컴파일 에러 확인이 불가능하다.
  • jpql만의 sql문 작성 방법을 알아야 한다.

⭐ 3. QueryDsl

Spring Data JPA에서 기본적으로 제공하는 제한적 메소드들로는 복잡한 쿼리를 생성하기가 쉽지 않은데요.

하지만, 대안으로 JPQL이나 Native Query를 선택하게 되면 타입 안정성을 손실하게 되어 쿼리에 문제가 있어도 추적이 어렵게 됩니다.

Querydsl JPA는 타입 안정성을 보장하며 복잡한 쿼리를 다룰 수 있도록 돕는 프레임워크입니다

실제 프로젝트를 작성하게 되면 db 탐색에 있어서 간단한 조건들을 요구하진 않는다.
많은 join을 거치는 경우도 있을 것이고, 많은 필터도 사용해야 할 때가 있다.

그런데 이런 경우 jpql을 사용한다면? 아주 큰 문제점이 있다.

필터는 "선택적"이다.
필터의 선택지는 여러개이고, 조건에 포함되지 않는 필터는 고려대상이 아니기에 db 조회 시 쿼리에 포함될 필요가 없다.

but.. 쿼리를 직접 작성하게 된다면 해당 필터가 포함되는 경우/포함되지 않는 경우 2가지로 작성해야 한다.
위와 같은 작업을 하게 되면 N개 필터에 대해 2^N개 쿼리가 생성되게 된다.

이렇게 "동적 쿼리" 를 구성해야 하는 경우 가장 효과적인 것이 queryDsl 이다.

동적 쿼리?
실행 시점 조건에 따라 쿼리의 내용이 동적으로 변경할 수 있는 쿼리이다.

repository 구성 예시

예제 코드

Q클래스?
링크 고고

3-1. 장점

  • IDE를 통한 자동완성 기능
  • Q클래스로 인한 컴파일 에러를 통해 코드 작성 시 에러 확인 가능
  • 동적 쿼리문 효율적으로 작성 가능
  • 쿼리의 조건에 함수를 넣어 값을 조정할 수 있기에 코드의 재사용성 증가
  • 유지보수가 용이함
    -> 엔티티 클래스 변경 시, 관련 Q클래스도 자동으로 변경됨
    -> 즉 쿼리에서 사용하는 필드 이름이 항상 최신 상태로 유지

3-2. 단점

(없음ㅋ)

  • 위 2가지 방식에 비해 설정이 어려움

⭐ 결론

@Query 어노테이션은 명시적인 JPQL을 작성할 수 있게 해주지만, 쿼리가 복잡해지면 가독성이나 유지보수 측면에서 한계가 있을 수 있다. 이런 경우에 QueryDSL을 사용하면 좀 더 강력하고 유연한 쿼리를 작성할 수 있다.

https://velog.io/@jung-min-ju/queryDsl


참고

0개의 댓글