[Spring] JPQL vs QueryDSLBackEnd/Spring2025. 10. 3. 00:31
Table of Contents
Spring Data JPA에서 복잡한 쿼리를 작성할 때 가장 많이 사용하는 방식은 JPQL과 QueryDSL입니다.
두 방법은 같은 결과를 낼 수 있지만 표현 방식과 장단점이 다릅니다.
JPQL와 QueryDSL의 특징 및 장단점을 알아본 뒤 각각 언제 사용하면 좋을지 알아봅시다.
JPQL (@Query 어노테이션 사용)
특징
- SQL과 비슷한 형태의 쿼리를 문자열로 직접 작성합니다.
- @Query 어노테이션을 통해 Repository 인터페이스에 선언합니다.
- 런타임 시점에 쿼리 오류를 발견합니다.
예시
public interface MemoRepository extends JpaRepository<Memo, Long> {
// title이 특정 값과 일치하는 Memo 조회
@Query("SELECT m FROM Memo m WHERE m.title = :title")
List<Memo> findByTitle(@Param("title") String title);
// 여러 ID를 조건으로 조회
@Query("SELECT m FROM Memo m WHERE m.id IN :ids")
List<Memo> findMemosByIds(@Param("ids") List<Long> ids);
}
장점
- 배우기 쉽고 SQL 경험이 있는 사람에게 직관적입니다.
- 간단한 쿼리는 빠르게 작성 가능합니다.
단점
- 문자열 기반이라서 오타, 컬럼명 변경 등에서 컴파일 타임 체크 불가
- 복잡한 조건이 많아지면 가독성이 떨어짐.
QueryDSL
특징
- 타입 안전(type-safe) 한 쿼리 작성 가능.
- 컴파일 시점에 오타/컬럼 변경 오류를 잡아줌.
- 동적 쿼리 작성이 매우 편리.
예시
@RequiredArgsConstructor
public class MemoQueryRepository {
private final JPAQueryFactory queryFactory;
public List<Memo> findMemosByCondition(String title, String content) {
QMemo memo = QMemo.memo;
JPAQuery<Memo> query = queryFactory.selectFrom(memo);
if (title != null && !title.isEmpty()) {
query.where(memo.title.contains(title));
}
if (content != null && !content.isEmpty()) {
query.where(memo.content.contains(content));
}
return query.fetch();
}
}
장점
- IDE 자동완성 지원하기 때문에 쿼리 작성 시 가독성과 생산성 향상합니다.
- 동적 쿼리 작성이 훨씬 간단합니다.
- 컴파일 시점에 오타/컬럼 변경 오류를 잡아주기 때문에 리팩토링 시 안전합니다. (엔티티 필드 변경 시 컴파일 에러 발생)
단점
- 초기 설정이 필요합니다. (QClass 생성, gradle/maven 설정).
- 간단한 쿼리에는 오히려 코드가 길어집니다.
언제 어떤 걸 써야 할까?
간단한 조회 쿼리
→ JPQL (@Query) 사용
복잡한 조건, 동적 필터링, 가독성이 중요한 경우
→ QueryDSL 사용
예: 검색 조건이 여러 개(제목/내용/작성일/작성자 등)이고, 조인과 페이징이 결합된 상황
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] 오프셋 기반 vs 커서 기반 페이징 기법 (5) | 2025.07.22 |
|---|---|
| [Spring] @Controller vs @RestController (0) | 2024.11.18 |
| [Spring/JPA] JPA Entity 연관 관계 (0) | 2024.11.17 |
| [SpringBoot] sts4 프로젝트 생성 및 환경설정 (0) | 2024.04.04 |
| [Springboot] 스프링 입문 - 스프링 빈과 의존 관계 (0) | 2024.04.01 |
@Dev Chu :: Log_Double 7
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!