QueryDSL이란?
앞서 JPA에 대해서 설명하였다. JPA란 Java에서 스키마를 엔티티로 매핑하여 데이터베이스를 객체 처럼 사용하게 하는 인터페이스라고 하였다.
JPA같은 경우 기본적인 CRUD 같은 경우는 기존 API나 Repository를 통해서 메서드 생성만으로도 Query 질의가 가능했지만, 조금더 복잡한 쿼리를 작성하기 위해서는 JPQL 이라는 문자열 기반 쿼리를 작성해서 사용해야 했다.
하지만, JPQL은 문자열 기반이기 때문에 컴파일 과정에서는 오류를 발견할 수 없으며, 결국 잘못된 JPQL은 런타임 상에서 오류를 발생한다.
QueryDSL은 이러한 문제를 해결할 수 있는 도구로서, 문자열기반이 아닌 자바 코드로 타입안정성을 보장하며 쿼리를 작성할 수 있게 해주는 프레임워크다. QueryDSL은 컴파일 시점에서 쿼리의 정확성을 검증할 수 있어 안정성이 높고, 타입 불일치 등의 문제를 미리 알 수 있어 런타임에 발생할 수 있는 오류를 줄일 수 있다.
QueryDSL 주요 특징
1. 유형 안정성(Type Safety)
QueryDSL은 컴파일 시점에 쿼리의 정확성이 검증되기 때문에, 잘못된 필드, 데이터 타입 불일치 등의 문제를 컴파일 단계에서 잡아내어 런타임 오류를 줄일 수 있다.
2. 도메인 모델 기반 쿼리 작성
JPA 엔티티를 기반으로 생성된 Q 클래스를 활용해 쿼리를 작성하도록 설계되어 있어, 엔티티 변경시 발생할 수 있는 영향이 QueryDSL 쿼리 까지 미치며 이는 안정성과 유지보수성이 높아지는 장점이 있다.
3. 동적 쿼리 작성
BooleanExpression과 같은 유틸리티를 제공하여, 조건에 따라 동적으로 쿼리를 조립할 수 있도록 한다.
4. SQL Injection 방지
QueryDSL은 Java 코드 기반으로 쿼리를 작성하므로 사용자 입력이 쿼리에 직접 삽입 되는 것이 아니라, 자바 메서드의 파라미터로 바인딩해서 처리하기 때문에 SQL Injection을 방지할 수 있다.
QueryDSL 기본 구성 요소
1. Q 클래스
QueryDSL은 Entity 클래스 기반으로 Q 클래스를 생성한다. 해당 클래스는 Entity 필드에 안전하게 접근할 수 있는 메서드와 속성을 제공한다.
2. JPAQueryFactory
JpaQueryFactory는 JPA 엔티티를 이용하여 JPQL 쿼리를 보다 쉽고 편리하게 작성할 수 있는 QueryDSL 도구이다.
QUser user = QUser.user;
QOrder order = QOrder.order;
List<Tuple> results = queryFactory
.select(user.name, order.amount)
.from(user)
.join(order).on(user.id.eq(order.userId))
.fetch();
3. BooleanExpression
QueryDSL에서 제공하는 조건표현 객체로, 쿼리의 조건을 동적으로 조립하거나 결합할 때 사용된다.
이를 활용하여 런타임시 동적으로 조건을 변경할 수 있다.
QUser user = QUser.user;
BooleanExpression isActive = user.status.eq("ACTIVE");
BooleanExpression isAdult = user.age.goe(18);
List<User> users = queryFactory
.selectFrom(user)
.where(isActive.and(isAdult))
.fetch();
QueryDSL 장단점
장점
1. 유형안정성
컴파일시 필드, 타입, 문법 등의 오류를 검출 할 수 있어 런타임 오류를 줄일 수 있다.
2. SQL Injection 방지
사용자 입력을 파라미터로 전달하는 식으로 처리하여 쿼리에 직접 바운딩 되지 않아서, SQL Injection 공격을 방지할 수 있다.
3. 간결하고 직관적인 코드
QueryDSL은 JPQL보다 간결하고 직관적이며, SQL과 유사하여 쉽게 이해할 수 있다.
4. 재사용 가능한 조건
자바 코드이기 때문에, 조건을 분리하여 재사용 가능한 코드로 작성이 가능하다.
단점
1. 초기 설정의 번거로움
build.gradle을 통해 annotation procession을 설정해야 Q 클래스를 생성할 수 있다.
2. 학습곡선
여느 기술과 마찬가지로 처음 사용시 학습 곡선이 높다는 단점이 있다.
3. 복잡한 쿼리 작성시 코드 증가
복잡한 쿼리 작성 시, 자바 코드가 길어질 수 있으며 직관적으로 보이지 않을 수 있다.
4. JPA 종속성
QueryDSL은 JPA 기반으로 동작하므로, JPA 사용을 하지 않는 프로젝트에서는 사용할 수 없다.
5. 복잡한 쿼리에 대한 한계
여전히 from 절에 sub 쿼리는 지원하지 않으며, 여러 고급 SQL 기능을 구현하기에 번거로울 수 있다.
'공부 > Spring Boot' 카테고리의 다른 글
[Database] 04. MyBatis (1) | 2024.11.17 |
---|---|
[Database] 02. JPA (0) | 2024.11.14 |
[Database] 01. JDBC (0) | 2024.11.13 |
[Spring Batch] 01. Spring Batch 기본 개념 (0) | 2024.11.13 |
[스프링 부트 공부 일지] 4. 웹 어플리케이션 서버 구축하기 (2) (0) | 2022.12.22 |