-
스프링 DB 데이터접근 기술 - QuerydslSpring-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) 메서드를 다른 쿼리에서도 함께 사용
'Spring-Boot > 스프링 DB 2편 - 데이터 접근 기술' 카테고리의 다른 글
스프링 DB 데이터접근 기술 - 스프링 트랜잭션 이해 (0) 2022.09.23 스프링 DB 데이터접근 기술 - 활용 방안 (0) 2022.09.23 스프링 DB 데이터접근 기술 - 스프링데이터 JPA (0) 2022.09.22 스프링 DB 데이터접근 기술 - JPA (0) 2022.09.22 스프링 DB 데이터접근 기술 - MyBatis (0) 2022.09.17