[CS][SpringBoot] QueryDSL

손경이·2024년 5월 4일
0

CS Study

목록 보기
24/25

QueryDSL


자바 코드로 쉽게 타입이 안전한(Type-Safe) SQL 쿼리를 작성할 수 있는 도메인(엔티티) 특화 언어


> QueryDSL

  • SQL 형식의 쿼리를 Type-Safe 하게 생성할 수 있도록 하는 DSL을 제공하는 라이브러리
  • 문자열이 아닌 코드로 쿼리를 작성할 수 있도록 도와줍니다.

용어 정리

  • DSL(Domain-Specific-Languages)
    • 특정 도메인에서 발생하는 문제를 효과적으로 해결하기 위해 설계된 언어
  • JPQL(JPA Query Language)
    • 엔티티 객체를 대상으로 쿼리를 작성하는 JPA의 질의 언어
    String jpql = "select m from Member as m where m.name = 'coco'";

> QueryDSL 장점

  • 문법적으로 잘못된 쿼리를 제공하지 않습니다.
    • 정상적으로 활용된 QueryDSL은 문법 오류를 발생시키지 않습니다.
  • 고정된 SQL 쿼리를 작성하지 않기 때문에 동적으로 쿼리를 생성할 수 있습니다.
  • 코드로 작성하므로 가동성 및 생산성이 향상됩니다.
  • 도메인 타입(자바 클래스, 엔티티)과 프로퍼티(속성, 필드)를 안전하게 참조할 수 있습니다.

> QueryDSL 단점

  • JPA에서 영속성 컨텍스트를 사용하지 않습니다.
    • 영속성 컨텍스트를 활용하는 JPA의 장점인 1차 캐시를 활용할 수 없습니다.
    • 같은 데이터를 여러 번 조회할 경우에도 매번 데이터베이스에서 새로운 쿼리를 실행해야 합니다.
  • QueryDSL 마지막 업데이트가 2021년 입니다.
  • 한 쿼리 안에 조건 필터링, 정령, 그룹화 등을 합니다.
    • 쿼리가 길어진다면 쿼리에 비즈니스 로직이 들어있는 것이 아닐까 생각해 봐야 합니다.

용어 정리

  • JPA(Java Persistence API)
    • Java 애플리케이션에서 관계형 데이터베이스를 다루기 위한 표준 인터페이스를 제공

> QueryDSL 언제 사용할까?

  • @Query 어노테이션으로 JPQL 쿼리를 작성해서 JPA의 쿼리메서드로 만들기 복잡했던 쿼리를 해결할 수 있었지만 이러한 방법은 직접 문자를 입력하기 때문에 컴파일 시점에 에러를 잡지 못하고 런타임 에러가 발생합니다.
  • 개발 환겨에서 문제가 없어보였지만 실제 운영 환경에서 오류가 발견될 수 있습니다.
  • 이 같은 문제를 해결하기 위해 사용되는 것이 QueryDSL 입니다. (문자열이 아닌 코드로 쿼리를 작성)

    JPQL 사용한 예시

    @Query("SELECT p FROM Product p WHERE p.name = :name")
      List<Product> findByName(@Param("name") String name);

QueryDSL 사용해보기


참고

0개의 댓글