Querydsl 설정

작성일

Querydsl 설정

springboot, gradle 버전에 따라 Querydsl 설정 방법이 많이 다르다. 주의하자!

  • SpringBoot version: 2.7.3
  • gradle: 7.5

gradle.build

// 1. querydsl version 정보 추가
buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}

plugins {
	id 'org.springframework.boot' version '2.7.3'
	id 'io.spring.dependency-management' version '1.0.13.RELEASE'
	// 2. querydsl plugins 추가
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
	id 'java'
}

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

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'

	// 3. querydsl dependencies 추가
	implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
	implementation "com.querydsl:querydsl-apt:${queryDslVersion}"

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

// 4. querydsl 추가 시작
// querydsl 에서 사용할 경로 설정
def querydslDir = "$buildDir/generated/querydsl"
// JPA 사용 여부와 사용할 경로를 설정
querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}
// build 시 사용할 sourceSet 추가
sourceSets {
	main.java.srcDir querydslDir
}
// querydsl 이 compileClassPath 를 상속하도록 설정
configurations {
	querydsl.extendsFrom compileClasspath
}
// querydsl 컴파일 시 사용할 옵션 설정
compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

검증용 Q 타입 생성

Gradle IntelliJ 사용법

  • Gradle → Tasks → build → clean
  • Gradle → Tasks → other → compileQuerydsl

Gradle 콘솔 사용법

  • ./gradlew clean compileQuerydsl
  • ./gradlew clean compileJava

Q 타입 생성 확인

  • build → generated → querydsl
    • study.querydsl.entity.QHello.java 파일이 생성되어 있어야 함

참고
Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다. 앞서 설정에서 생성 위치를 gradle build 폴더 아래 생성되도록 했기 때문에 이 부분도 자연스럽게 해결된다. (대부분 gradle build 폴더를 git에 포함하지 않는다.)

Querydsl Q타입이 정상 동작하는지 확인하는 테스트 코드

@SpringBootTest
@Transactional
class QuerydslApplicationTests {

    @Autowired
    EntityManager em;

    @Test
    void contextLoads() {
        Hello hello = new Hello();
        em.persist(hello);

        JPAQueryFactory query = new JPAQueryFactory(em);
//        QHello qHello = new QHello("h");
        QHello qHello = QHello.hello;

        Hello result = query
                .selectFrom(qHello)
                .fetchOne();

        assertThat(result).isEqualTo(hello);
        assertThat(result.getId()).isEqualTo(hello.getId());
    }
}

Querydsl 관련 라이브러리

  • querydsl-apt: Querydsl 관련 코드 생성 기능 제공, Q타입 생성해준다.
  • querydsl-jpa: querydsl 라이브러리, 애플리케이션 코드 작성을 도와준다.

Querydsl 작성

기본 설정

@SpringBootTest
@Transactional
@Commit
public class QuerydslTests {

    @Autowired
    EntityManager em;

    JPAQueryFactory queryFactory;

    @BeforeEach
    void before() {
        queryFactory = new JPAQueryFactory(em);
    }

}

기본 Q-클래스 사용 방법

별칭 직접 지정

@Test
void startQuerydsl1() {
    QMember m = new QMember("m");

    queryFactory
            .selectFrom(m)
            .where(m.username.eq("username1"));
}

기본 인스턴스 사용

@Test
void startQuerydsl2() {

    queryFactory
            .selectFrom(QMember.member)
            .where(QMember.member.username.eq("username1"));
}

기본 인스턴스를 static import와 함께 사용

import static study.querydsl.entity.QMember.*;

@Test
void startQuerydsl3() {

    queryFactory
            .selectFrom(member)
            .where(member.username.eq("username1"));
}

참고. 같은 테이블을 조인해야 하는 경우가 아니면 기본 인스턴스를 사용하자.