What we have to do is to be forever curiously
testing new opinions and courting new impressions

우리가 해야 할 일은 끊임없이 호기심을 갖고
새로운 생각을 시험해보고 새로운 인상을 받는 것

QueryDSL에 대해

  • 정의
  • 설정
  • 사용 예시


정의

Spring Data JPA는 기본적으로 CRUD 메서드 및 쿼리 메서드 기능 제공

원하는 조건의 데이터를 수집하기 위해서는 JPQL을 작성할 필요

but 복잡한 로직의 경우, 개행이 포함된 쿼리 문자열이 상당히 길어지면서 휴먼 에러(JPQL 문자열에 오타 혹은 문법 오류) 발생 가능성 높음

정적 쿼리라면 컴파일 시 발견할 수 있으나, 그렇지 않은 경우 런타임 시점에서 에러가 발생

QueryDSL은 정적 타입을 이용, SQL 쿼리를 생성해 이러한 문제를 예방하는 프레임워크


설정

의존성 설정(build.gradle)

dependencies {
    implementation 'com.querydsl:querydsl-jpa:4.4.0'
    annotationProcessor 'com.querydsl:querydsl-apt:4.4.0:jpa'
}

Querydsl 설정(build.gradle)

// Querydsl 설정
def generatedDir = "$buildDir/generated/querydsl"

tasks.withType(JavaCompile) {
    options.annotationProcessorGeneratedSourcesDirectory = file(generatedDir)
}
sourceSets.main.java.srcDirs += "$buildDir/generated/querydsl"

clean.doLast {
    file(generatedDir).delete()
}

위와 같이 build.gradle 파일에 설정을 추가하면, 프로젝트 빌드할 때마다 자동으로 Querydsl 관련 클래스와 빌더가 생성


사용 예시

// 엔티티 QMember 클래스
QMember member = QMember.member;

// member 엔티티의 id가 1인 엔티티를 조회
List<Member> members = em.createQuery("select m from Member m where m.id = :id", Member.class)
.setParameter("id", 1L)
.getResultList();

// member 엔티티의 name이 "홍길동"인 엔티티를 조회
Member member = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", "홍길동")
.getSingleResult();

// member 엔티티의 name이 "홍길동"이고 age가 20살 이상인 엔티티를 조회
List<Member> members = em.createQuery("select m from Member m where m.name = :name and m.age >= :age", Member.class)
.setParameter("name", "홍길동")
.setParameter("age", 20)
.getResultList();

위 예시에서 QMember는 QueryDSL에서 제공하는 Member 엔티티의 클래스

em.createQuery() 메서드는 JPQL 쿼리를 실행하여 결과를 반환

setParameter() 메서드는 JPQL 쿼리에 파라미터를 설정

QueryDSL은 JPQL을 Java 코드로 작성할 수 있도록 도와주는 프레임워크

QueryDSL을 사용하면 JPQL 쿼리의 오류를 컴파일 시점에 발견할 수 있으므로, 런타임 시점에 발생하는 오류 방지 가능


태그:

카테고리:

업데이트:

댓글남기기