본문 바로가기
JPA

Querydsl 사용 개요

by Heesu.lee 2021. 4. 25.

최신 백엔드 기술로는 주로 Spring Boot 와 Spring Data JPA 사용한다.

그렇지만, 복잡한 쿼리나 동적 쿼리에 대해서 불편함이 존재한다.

 

이러한 상황 속에서 마지막 퍼즐 조각처럼 사용할 수 있는 기술이 바로 Querydsl 이다.

 

Querydsl 의 경우 다음과 같은 특징을 가진다.

쿼리를 자바 코드로 작성할 수 있도록 해준다. 그리고 이러한 경우 컴파일 시점에 문법적인 오류를 잡아낼 수 있다.

또한, 복잡한 쿼리 즉 동적 쿼리에 대해서 편의성을 제공해준다.

 

스프링 데이터 JPA + Querydsl 사용은 선택이 아닌 필수 

관계형 DB 를 사용하며, 복잡한 핵심 비즈니스 로직을 개발하는데 있어 Querydsl 은 필수적인 기술이다.

 

이는 단순 반복 문제를 해결해주며, 쿼리를 자바 코드로 작성할 수 있도록 인터페이스를 제공한다.

 

JPQL 과 Querydsl 비교

    @DisplayName("JPQL 사용")
    @Test
    void jpql() {
        String username = "kim";
        String query = "select m from Member m where m.username = :username";

        List<Member> members = em.createQuery(query, Member.class)
                .getResultList();
    }

    @DisplayName("Querydsl 사용")
    @Test
    void querydsl() {
        String username = "kim";

        List<Member> members = queryFactory
                .select(QMember.member)
                .from(QMember.member)
                .where(QMember.member.username.eq(username))
                .fetch();
    }

앞서 설명드린 Querydsl 사용 이점에 대해 코드로 간략히 살펴보도록 하자

 

jpql 사용하는 경우 쿼리 작성을 문자열로 해야하는데, 이 과정에서 작성자가 어떤 실수를 할지 모른다.

가령 띄어쓰기가 들어간다던지, 오타가 발생한다는지 등 실수가 들어간 경우 컴파일러 입장에서 이러한 문제 사항을 파악할 수 없다.

이는 결과적으로 실제 실행되어야만 해당 부분에 문제가 있는지 확인할 수 있다.

 

반면, Querydsl 을 사용하는 경우엔, 자바 코드로 쿼리를 작성하기 때문에 작성 과정에서 문법적인 오류를 바로 발견하고 수정할 수 있다.

이런 경우 컴파일 시점에 문제 사항들을 앞서 발견하고 수정할 수 있도록 해준다.

 

위 예제는 단순히 자바코드로 쿼리를 작성하는 경우의 이점을 설명드린거지만,

Querydsl 의 사용은 보다 더 복잡한 쿼리들을 작성할 때 많은 장점들을 사용자로 하여금 느낄 수 있도록 해준다. (동적 쿼리 등)

 

Build Gradle 설정

plugins {
	id 'org.springframework.boot' version '2.4.5'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'

	// Querydsl 설정
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
	
	id 'java'
}

group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	// Querydsl 설정
	implementation 'com.querydsl:querydsl-jpa'

	implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'
}

test {
	useJUnitPlatform()
}

// Querydsl 설정
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}
sourceSets {
	main.java.srcDir querydslDir
}
configurations {
	querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}

해당 설정은 단일 모듈(싱글 모듈 프로젝트) 인 경우에 사용할 수 있는 build.gradle 인점 참고 부탁드립니다.

멀티 모듈 사용하는 경우는 따로 다룰 수 있도록 하겠습니다.

 

gradle → tasks → other → compileQuerydsl 실행

QClass

위 설정처럼 build/generated/querydsl 하위 디렉토리에 작성된 Entity 에 해당하는 Q Class 들이 생성된다.

 

이제 Querydsl 을 사용할 수 있는 준비는 모두 마쳤다. 

다음 게시글은 Querydsl 을 어떻게 사용하고 활용하는지 작성할 수 있도록 하겠다.

 

참고

  • 해당 게시글은 김영한님의 실전! Querydsl 강의를 참고하여 작성하였습니다.
  • 더 자세한 내용은 강의를 통해 확인하시는 걸 적극 추천드립니다.

'JPA' 카테고리의 다른 글

Querydsl 중급 문법  (0) 2021.04.28
Querydsl 기본 문법  (0) 2021.04.26
쿼리 메소드 기능  (0) 2021.01.26
객체지향 쿼리 언어  (0) 2021.01.25
프록시와 연관관계 관리  (0) 2021.01.20

댓글