ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 DB 데이터접근 기술 - Querydsl
    Spring-Boot/스프링 DB 2편 - 데이터 접근 기술 2022. 9. 23. 11:03

    QUERY의 문제점

    - QUERY는 문자, Type-check 불가능

    - 실행하기 전까지 작동여부 확인 불가

     

    에러는 크게 2가지

    - 컴파일 에러 ( 좋은 에러 )

    - 런타임 에러 ( 나쁜 에러 )

     

    * QueryDSL *

    - 쿼리를 Java로 type-safe하게 개발할 수 있게 지원하는 프레임워크

    - 주로 JPA 쿼리(JPQL)에 사용

     

    * JPA에서 QUERY 방법은 크게 3가지 *

    1. JPQL(HQL)

        ㆍ장점 : SQL QUERY와 비슷해서 금방 익숙해짐

        ㆍ단점 : type-safe 아님, 동적쿼리 생성이 어려움

    2. Criteria API

        ㆍ장점 : 동적쿼리 생성이 쉬움?

        ㆍ단점

             ㆍ1. type-safe 아님

             ㆍ2. 너무 너무 너무 복잡함

             ㆍ3. 알아야 할게 너무 많음

    3. MetaModel Criteria API (type-safe)

        ㆍroot.get("age") → root.get(Member_.age)

        ㆍCriteria API + MetaModel

        ㆍCriteria API와 거의 동일

        ㆍtype-safe

        ㆍ복잡하긴 마찬가지

     

    QueryDSL 분석

    DSL

    - Domain(도메인) + Specific(특화) + Language(언어)

    - 특정한 도메인에 초점을 맞춘 제한적인 표현력을 가진 컴퓨터 프로그래밍 언어

    - 특징 : 단순, 간결, 유창

     

    QueryDSL

    - 쿼리 + 도메인 + 특화 + 언어

    - 쿼리에 특화된 프로그래밍 언어

    - 단순, 간결, 유창

    - 다양한 저장소 쿼리 기능 통합

     

    - JPA, MongoDB, SQL 같은 기술들을 위해 type-safe SQL을 만드는 프레임워크

     

    Querydsl-JPA

    - Querydsl은 JPA 쿼리(JPQL)을 typesafe하게 작성하는데 많이 사용

    - 자동방식

        ㆍQUERYDSL → JPQL → SQL

    - 장점

        ㆍtype-safe

        ㆍ단순함

        ㆍ쉬움

    - 단점

        ㆍQ코드 생성을 위한 APT를 설정

     

    SpringDataJPA + Querydsl

    - SpringData 프로젝트의 약점은 조회

    - Querydsl 로 복잡한 조회 기능은 보완

        ㆍ복잡한 쿼리

        ㆍ동적 쿼리

    - 단순한 경우 : SpringDataJPA

    - 복잡한 경우 : Querydsl 직접 사용


    Querydsl 설정

    참고 : Q타입은 컴파일 시점에 자동 생성되므로 버전관리에 포함하지 않는 것이 좋다.

     

    * Q타입 삭제 *

    - `gradle clean`을 수행하면 build 폴더 자체가 삭제된다.

    //Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거
    clean {
    	delete file('src/main/generated')
    }

    - `IntelliJ IDEA` 옵션을 선택하면 `src/main/generated` 에 파일이 생성되고, 필요한 경우 Q파일을 직접 삭제해야한다.

    - `gradle`에 해당 스크립트를 추가하면 `gradle clean` 명령어를 실행할 때 `src/main/generated`의 파일도 함께 삭제

     

    * 참고 *

    - Querydsl은 이렇게 설정하는 부분이 사용하면서 조금 귀찮은 부분인데, IntelliJ가 버전업을 하거나 Querydsl의 Gradle 설정이 버전업하면서 적용 방법이 조금씩 달라지기도 한다.

    - 그리고 본인의 환경에 따라서 잘 동작하지 않기도 한다.

    - `querydsl gradle`로 검색하면 본인 환경에 맞는 대안을 금방 찾을 수 있다.

     

     

    * 공통 *

    - Querydsl 을 사용하려면 `JPAQueryFactory`가 필요하다. `JPAQueryFactory`는 JPA 쿼리인 JPQL을 만들기 때문에 `EntityManager`가 필요하다

    - 설정 방식은 `JdbcTemplate`을 설정하는 것과 유사하다

    - 참고로 `JPAQueryFactory`를 스프링 빈으로 등록해서 사용해도 된다.

     

     

    * Querydsl 장점 *

    - Querydsl 덕분에 동적 쿼리를 매우 까름하게 사용할 수 있다

    List<Item> result = query
            .select(item)
            .from(item)
            .where(likeItemName(itemName), maxPrice(maxPrice))
            .fetch();

    - 쿼리 문장에 오타가 있어도 컴파일 시점에 오류를 막을 수 있다

    - 메서드 추출을 통해서 코드를 재사용할 수 있다.

       예를 들어서 likeItemName(itemName), maxPrice(maxPrice) 메서드를 다른 쿼리에서도 함께 사용

     

    댓글

Designed by Tistory.