[JPA] QueryDSL

김현정·2025년 5월 8일
0

QueryDSL

: QueryDSL은 하이버네이트 쿼리 언어 (HQL: Hibernate Query Language)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다.

QueryDSL은 정적 타입을 이용하여 SQL과 같은 쿼리를 생성할 수 있게해준다.

자바 백엔드 기술은 SpringBoot와 Spring Data JPA를 함께 사용한다.
하지만 복잡한 쿼리, 동적 쿼리를 구현하는데 있어서 한계가 있기에 문제를 해결하기 위해서 QueryDSL를 사용한다.

QueryDSL은 오픈소스 프로젝트로 JPQL을 Java코드로 작성할 수 있도록 하는 라이브러리이다.

Entity의 매핑정보를 활용하여 쿼리에 적합하도록 쿼리 전용 클래스(Q클래스)로 재구성해주는 기술이다.

QueryDSL 장점

  • 문자가 아닌 코드로 쿼리를 작성할 수 있어서 컴파일 시점에 문법 오류를 확인할 수 있다.
  • 복잡한 쿼리나 동적 쿼리 작성이 편리하다.
  • 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.
  • JPQL 문법과 유사한 형태로 작성할 수 있어 쉽게 적응할 수 있다.

QueryDSL 설정

// build.grdle

dependencies {
	...
	// QueryDSL 추가
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"

	...
}

clean {
	delete file('src/main/generated')
}

의존성에 주석 아랫 부분을 추가하고 clean 부분도 추가한다. 그 후 gradle에서 compileJava를 실행시켜주면 Q클래스가 생성.

QueryDSL 사용

기본 문법

QueryDSL은 select, from, where 등 쿼리 작성에 필요한 키워드를 메서드 형식으로 제공한다.

QueryDSL을 사용하기위해선 JPAQueryFactory가 필요하다. 여기서는 JPAQueryFactory 객체를 EntityManager 객체로 생성했지만 Bean으로 등록해서 사용하는 방법도 있다.

JPQL과 QueryDSL 비교

JPQL

@Query("SELECT t FROM Todo t WHERE t.weather = :weather")
List<Todo> findByWeather(@Param("weather") String weather);

JPQL은 문자열 기반 쿼리로, 간단한 조건일 경우 코드가 짧고 명확하다.
하지만 복잡한 조건이 많아질수록 문자열 관리가 어렵고, 컴파일 시점에 오류를 잡기 힘들다.

QueryDSL

QTodo todo = QTodo.todo;
List<Todo> result = queryFactory
    .selectFrom(todo)
    .where(todo.weather.eq("SUNNY"))
    .fetch();

QueryDSL은 타입 안정성이 강점이며, 동적 쿼리 작성에 유리하다.
조건이 여러 개일 때도 BooleanBuilder 등을 활용해 유연하게 조합할 수 있어 유지보수가 편리하다.

0개의 댓글