오봉이와 함께하는 개발 블로그

Querydsl - 설정, 예제 도메인 모델 본문

BE/JPA

Querydsl - 설정, 예제 도메인 모델

오봉봉이 2022. 9. 15. 21:41
728x90

설정

  • 사용 기능
    • Spring Web
    • JPA
    • H2 DB
    • lombok

build.gradle

Spring Boot 2.6, Querydsl 5.0 이상부터 설정 방법이 바뀌었기 때문에 현재 버전에 맞춰 설정했다.

//querydsl 추가
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'

    //querydsl 추가
    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'

    //querydsl 추가
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    annotationProcessor "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()
}

//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}
sourceSets {
    main.java.srcDir querydslDir
}
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

검증용 엔티티 생성

@Entity
@Getter
@Setter
public class Hello {
    @Id @GeneratedValue
    private Long id;
}

검증용 Q 타입 생성

  • Gradle -> Tasks -> build -> clean
  • Gradle -> Tasks -> other -> compileQuerydsl

혹은 콘솔(터미널)에서

  • ./gradlew clean
  • ./gradlew compileQuerydsl

위 프로세스를 실행하면 build -> generated -> querydsl에 study.querydsl.entity.QHello.java 파일이 생성되어 있어야 한다.

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

package study.querydsl.entity;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
 * QHello is a Querydsl query type for Hello
 */
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QHello extends EntityPathBase<Hello> {

    private static final long serialVersionUID = 1910216155L;

    public static final QHello hello = new QHello("hello");

    public final NumberPath<Long> id = createNumber("id", Long.class);

    public QHello(String variable) {
        super(Hello.class, forVariable(variable));
    }

    public QHello(Path<? extends Hello> path) {
        super(path.getType(), path.getMetadata());
    }

    public QHello(PathMetadata metadata) {
        super(Hello.class, metadata);
    }

}

테스트 케이스로 실행 검증

@SpringBootTest
@Transactional
class QuerydslApplicationTests {

    @Autowired
    EntityManager em;

    @Test
    void contextLoads() {

        Hello hello = new Hello();
        em.persist(hello);

        JPAQueryFactory query = new JPAQueryFactory(em);
        QHello qHello = QHello.hello; // Querydsl Q타입 동작 확인
        // public static final QHello hello = new QHello("hello"); <- QHello.java에 있는 코드

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

        Assertions.assertThat(result).isEqualTo(hello);
        //lombok 동작 확인 (hello.getId())
        Assertions.assertThat(result.getId()).isEqualTo(hello.getId());
    }

}

application.properties

spring.datasource.url=jdbc:h2:tcp://localhost/~/querydsl
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

spring.jpa.hibernate.ddl-auto=create
#spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true

logging.level.org.hibernate.SQL=debug
#logging.level.org.hibernate.type=trace
  • spring.jpa.hibernate.ddl-auto=create
    • 이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.

모든 로그 출력은 가급적 로거를 통해 남겨야 한다.
show_sql : System.out 에 하이버네이트 실행 SQL을 남긴다.
org.hibernate.SQL : logger를 통해 하이버네이트 실행 SQL을 남긴다.

쿼리 파라미터 로그 남기기

build.gradle에 다음 추가

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

쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 된다. 하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.


예제 도메인 모델과 동작확인

https://5bong2-develop.tistory.com/431
위 링크와 같은 도메인 모델을 사용한다.

인프런 김영한 지식공유자님 강의 : 실전! Querydsl
728x90
Comments