개발노트

25.02.19 QueryDSL 본문

Spring Boot

25.02.19 QueryDSL

ddong-kka 2025. 2. 19. 22:54

개요

queryDSL 에 대해 공부가 필요할 것 같다. 정리해본다.

 

QueryDSL 이란?

타입 안전(type-safe) 하고 직관적인 Java 기반의 동적 SQL 쿼리 빌더 이다.

주로 JPA, Hibernate, SQL, MongoDB 등의 데이터베이스와 함께 사용되며, 코드 기반으로 SQL 쿼리를 작성할 수 있도록 도와주는 프레임 워크다.

 


특징

 

타입 안정성( Type-safety )

  • 컴파일 단계에서 SQL 문법 오류를 잡을 수 있다.
  • 필드명을 직접 문자열로 입력하는 것이 아니라 코드 기반으로 사용하여, 오타로 인한 오류가 방지된다.

가독성 및 유지보수성 증가

  • JPQL이나 SQL을 직접 문자열로 작성하는 방식보다 코드가 직관적
  • IDE의 자동 완성 기능을 활용 가능

동적 쿼리 작성이 용이

  • BooleanBuilder 를 활용하여 조건을 유동적으로 추가 기능
  • 복잡한 동적 쿼리를 쉽게 구성할 수있음

JPA 및 다양한 데이터베이스 지원

  • Spring Data JPA와 호환되어 JPARepository와 함께 사용 가능
  • SQL, MongoDB, Lucene 등 다양한 데이터 소수와 연동

 


QueryDSL 사용법

 

1. 의존성 추가

먼저 QueryDSL을 사용하려면 build.gradle에 의존성을 추가해야한다.

dependencies {
    implementation 'com.querydsl:querydsl-jpa:5.0.0'  // QueryDSL JPA 지원
    annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa' // QClass 자동 생성
}

 

 

2. QClass 생성

QueryDLS은 엔티티 클래스를 기반으로 QCLass(QueryDSL 전용 클래스)를 생성한다.

./gradlew compileQuerydsl 명령어를 실행하면 Qclass가 자동 생성된다.

 

@Entity 어노테이션이 적용된 클래스를 기준으로 QClass가 생성된다.

Qclass가 생성되어야 QueryDSL을 사용할 수 있다.

 

 

3. QueryDSL 기본 쿼리 작성

@Autowired
private JPAQueryFactory queryFactory;

public User findByUsername(String username) {
    QUser user = QUser.user; // QueryDSL에서 제공하는 Q클래스

    return queryFactory
        .selectFrom(user)
        .where(user.username.eq(username))  // username이 같은 데이터 조회
        .fetchOne();  // 단일 결과 반환
                      //fetch() 는 리스트로 전체 리스트 조회
}

 

 

4. 동적 쿼리 작성

BooleanBuilder를 활용한 동적 쿼리

여러 검색 조건을 조합하여 데이터를 조회할 경우, BooleanBuilder를 활용하면된다.

public List<User> searchUsers(String username, Integer age) {
    QUser user = QUser.user;
    BooleanBuilder builder = new BooleanBuilder();

    if (username != null) {
        builder.and(user.username.eq(username));
    }

    if (age != null) {
        builder.and(user.age.gt(age));
    }

    return queryFactory
        .selectFrom(user)
        .where(builder)
        .fetch();
}

조건이 null인 경우는 where절에서 제외되므로 동적인 조건 처리가 가능하다.

 

 


정리

  • QueryDSL은 타입 안전한 동적 SQL/JPA 쿼리 빌더로 코드기반으로 SQL을 작성할 수 있다.
  • JPQL보다 가동석이 높고 유지보수가 용이
  • BooleanBuilder 등을 이용해 동적 쿼리 작성이 가능
  • JPAQueryFactory를 사용하여 손쉽게 데이터를 조회 가능

 

 


spring boot 로 프로젝트를 하는거면 사용하는게 더욱 좋을 거 같다.