BE/Spring & Spring Boot

[Spring Boot] QueryDSL

baek-dev 2025. 2. 7. 19:43

QueryDSL 개념

 

QueryDSL은 타입 안전한 JPQL(또는 SQL) 쿼리를 작성하기 위한 라이브러리임. 일반적으로 JPA를 사용할 때 JPQL을 문자열로 작성하는데, 이는 컴파일 타임에 오류를 잡을 수 없고 실행 시에 오류가 발생할 위험이 있음. QueryDSL은 이를 보완하여, 코드를 작성하는 시점에 컴파일러가 쿼리의 오류를 검출할 수 있도록 해줌.

 

QueryDSL은 Java 코드를 통해 쿼리를 작성할 수 있게 해주며, 이를 통해 가독성과 유지보수성을 높일 수 있음.


주요 특징

  1. 타입 안전(Type-safe):
    • 컴파일 타임에 쿼리의 구조와 필드 타입을 검증함.
    • 예를 들어, 정수 필드에 문자열을 비교하는 등의 오류를 방지할 수 있음.
  2. 코드 자동 생성:
    • 엔티티 클래스를 기반으로 QClass라는 쿼리용 클래스를 자동 생성함.
    • QClass를 통해 코드로 쿼리를 작성할 수 있음.
  3. JPQL과 유사한 문법:
    • JPQL 문법과 매우 유사하지만, 코드 기반으로 작성하기 때문에 가독성이 더 높음.
  4. 동적 쿼리 지원:
    • 조건에 따라 쿼리를 유동적으로 생성할 수 있음.
    • • 예를 들어, 검색 조건이 있을 때만 해당 조건을 쿼리에 추가 가능.

QueryDSL의 작동 방식

1. Gradle/Maven 설정:

  • QueryDSL을 사용하려면 의존성을 추가하고, QClass를 자동 생성하기 위한 설정이 필요함.
  • Gradle 예시:
dependencies { implementation 'com.querydsl:querydsl-jpa:5.0.0' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa' }

 

2.  QClass 생성:

  • QueryDSL은 엔티티 클래스를 기반으로 QClass를 생성함.
  • 예: Member 엔티티가 있다면, QMember 클래스가 생성됨.
  1.  

3. QueryDSL 쿼리 작성:

  • 쿼리 작성 시 JPAQueryFactory를 사용하여 쿼리를 생성함.

QueryDSL 예제 코드

 

1. 엔티티 정의

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;

    private String name;

    private int age;

    // Getter, Setter
}

 

2. QClass 생성

  • QueryDSL이 자동으로 QMember 클래스를 생성함.
  • QMember는 Member 클래스의 모든 필드를 포함하는 쿼리 전용 클래스임.

 

3. QueryDSL로 쿼리 작성

@Autowired
EntityManager em;

@Test
public void queryDslTest() {
    JPAQueryFactory queryFactory = new JPAQueryFactory(em);
    QMember member = QMember.member;

    // 조건: age가 30 이상인 멤버를 조회
    List<Member> result = queryFactory
        .selectFrom(member)
        .where(member.age.goe(30)) // age >= 30
        .fetch();

    result.forEach(m -> System.out.println(m.getName()));
}

QueryDSL 주요 메서드 및 문법

  1. select():
    • 반환할 필드를 지정.
    • 예: queryFactory.select(member.name)
  2. where():
    • 조건을 지정.
    • 예: where(member.age.between(20, 30))
  3. fetch():
    • 결과를 리스트로 반환.
  4. and() / or():
    • 조건을 결합할 때 사용.
    • 예: where(member.age.gt(20).and(member.name.eq("John")))
  5. 정렬 (orderBy):
    • 예: orderBy(member.age.desc())
  6. 페이징 (offset, limit):
    • 예: offset(0).limit(10)

QueryDSL 장점과 단점

 

장점:

  1. 컴파일 타임 오류 검출:
    • 문자열 기반 쿼리와 달리, 코드 작성 시점에 오류를 감지할 수 있음.
  2. 동적 쿼리 작성 용이:
    • 조건에 따라 유동적으로 쿼리를 생성 가능.
  3. 가독성:
    • 코드 기반 쿼리로 가독성이 높아지고 유지보수가 쉬움.
  4. 타입 안정성:
    • 필드의 데이터 타입에 따라 쿼리를 검증하기 때문에 오류 가능성이 줄어듦.

단점:

  1. 러닝 커브:
    • 처음 배우는 개발자에게는 익숙해지기까지 시간이 걸릴 수 있음.
  2. 의존성 추가 필요:
    • 별도의 라이브러리를 추가하고 설정해야 함.
  3. QClass 생성:
    • 엔티티가 많아질수록 QClass 관리가 번거로울 수 있음.

 

요약

  • QueryDSL은 타입 안전하고 가독성이 높은 쿼리 작성을 가능하게 하는 도구임.
  • 동적 쿼리에 적합하며, 컴파일 타임 오류 검출이 가능함.
  • 초기 설정 및 학습이 필요하지만, 복잡한 쿼리를 작성할 때 유리함.

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] JaCoCo (Java Code Coverage)  (1) 2025.02.10
[Spring Boot] @Slf4j  (1) 2025.02.09
[Spring Boot] @Scheduled  (0) 2025.02.05
[Spring Boot] SpringDoc  (0) 2025.01.28
[Spring Boot] SpringSecurity UserDetails, User  (0) 2025.01.24