[Spring] Spring boot 3.x 이상 Querydsl 초기설정

최혜원·2023년 10월 24일
1
post-thumbnail

📍QueryDSL

  • JPA에서 제공하는 객체지향쿼리인 JPQL(Java Persistence Query Language)을 통해 동적 쿼리를 구성하면 코드가 굉장히 난잡해진다는 것을 느낄 수 있다.
  • JPQL은 문자열을 사용한다. 문자열을 조건에 따라 이어붙이는 형식으로 구성하기 때문에 생기는 문제가 있다. 문자열이기에 오타가 발생해도 컴파일 단계에서 에러를 잡아주지 못한다.(다만, NamedQuery를 사용하면 가능하다.) 또한 동적쿼리를 구성할 때, 중간중간 if문에 의해 문자열이 추가되기 때문에 가독성이 떨어진다. 따라서 쿼리를 체계적으로 관리하기 어렵다.
  • QueryDSL은 위와 같은 문제를 해결하기 위해 만들어졌다. Type-Safe한 쿼리를 사용하기 위해 엔티티와 매핑되는 정적 타입 QClass를 생성해 쿼리를 생성할 수 있게 만들었다. 컴파일 단계에서 오류를 잡아낼 수 있고 메소드 체이닝을 통해 조건을 보다 쉽게 추가할 수 있다. 즉, 동적 쿼리를 작성할 때 용이해진다는 말이다.
  • QueryDSL도 내부적으로는 JPQL를 구성해 쿼리를 만들어낸다. 다만, 사용자들이 편하게 사용할 수 있게 추상화해놓은 JPQL 빌더라고 생각하면 된다.

📌 IntelliJ Gradle 대신에 자바로 바로 실행하기

최근 IntelliJ 버전은 Gradle로 실행을 하는 것이 기본 설정이다. 이렇게 하면 실행속도가 느리다. 다음과 같이 변경하면 자바로 바로 실행하므로 좀 더 빨라진다.
1. Preferences Build,Execution,Deployment BuildTools Gradle
2. Build and run using: Gradle IntelliJ IDEA
3. Run tests using: Gradle IntelliJ IDEA

📌 동작 확인


📍Querydsl 설정

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.3'
}

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

java {
    sourceCompatibility = '17'
}

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 추가 (Spring boot 3.x 이상)
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

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

/**
 * QueryDSL Build Options
 */
def querydslDir = "src/main/generated"

sourceSets {
    main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile).configureEach {
    options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

clean.doLast {
    file(querydslDir).deleteDir()
}


📍QClass 생성 및 삭제

생성

  • Gradle - Task - other - compileJava를 실행하면 된다.

  • 아래와 같이 src/main/generated 경로에 QClass가 생성된다.

삭제

  • Gradle - Task - build - clean 을 실행하면 된다.
  • src/main/generated 디렉토리와 파일이 전부 삭제된다.

주의사항

  • src/main/generated 디렉토리는 개발할 때 편의를 위해 사용하는 것이다. 실제 배포를 위해 build를 명령어를 실행할 때, 코드 실행을 위해 필요한 QClass들이 build 디렉토리의 entity와 같은 경로에 전부 포함되기 때문에 Docker와 같은 컨테이너에 generated 디렉토리를 COPY해서 넣을 이유가 없다.
  • 참고: Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다. 앞서 설정에서 생성 위치를 gradle build 폴더 아래 생성되도록 했기 때문에 이 부분도 자연스럽게 해결된다. (대부분 gradle build 폴더를 git에 포함하지 않는다.)

📍Querydsl검증

테스트 케이스로 실행 검증

  • Querydsl Q타입이 정상 동작하는가?
  • lombok이 정상 동작 하는가?

    참고: 스프링 부트에 아무런 설정도 하지 않으면 h2 DB를 메모리 모드로 JVM안에서 실행한다.


📍Querydsl 라이브러리 살펴보기

  • querydsl-apt: Querydsl 관련 코드 생성 기능 제공(코드 제너레이션 라이브러리 ex)Qhello )
  • querydsl-jpa: querydsl 라이브러리(실제 코드 제너레이션을 만들기 위해 사용하는 라이브러리)
  • querydsl-apt는 소스 코드 레벨에서 Querydsl 관련 어노테이션들을 처리하고 쿼리 타입 클래스들을 생성해주는 역할을 한다. 이를 통해 쿼리를 직접 작성하는 대신 Java 코드를 활용하여 컴파일러가 검사하는 안전한 방법으로 쿼리를 작성할 수 있다. sourceSets에 QClass를 저장할 경로를 설정해주면 해당 경로에 쿼리 타입 클래스를 생성해준다.

    테스트짤 때 편리한 라이브러리

📍H2 데이터베이스 설치

개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공

choihyewon@choehyewon-ui-noteubug Spring % cd /Users/choihyewon/Desktop/개발/Backend_Spring/Spring/kim-querydsl
choihyewon@choehyewon-ui-noteubug kim-querydsl % cd h2/bin
choihyewon@choehyewon-ui-noteubug bin % chmod 755 h2.sh
choihyewon@choehyewon-ui-noteubug bin % ls -alrth
total 5136
-rw-rw-r--@ 1 choihyewon  staff   105B Sep 16 18:03 h2w.bat
-rwxr-xr-x@ 1 choihyewon  staff   109B Sep 16 18:03 h2.sh
-rw-rw-r--@ 1 choihyewon  staff    98B Sep 16 18:03 h2.bat
-rw-rw-r--@ 1 choihyewon  staff   2.5M Sep 16 18:03 h2-2.2.224.jar
drwxr-xr-x@ 6 choihyewon  staff   192B Oct 24 22:56 .
drwxr-xr-x@ 9 choihyewon  staff   288B Oct 24 22:59 ..
choihyewon@choehyewon-ui-noteubug bin % ./h2.sh


최소 한번

데이터베이스 생성! → 연결끊고→ jdbc:h2:tcp://localhost/~/querydsl 이렇게 접속

insert


조회했는데 데이터가 없는이유? 테스트에 트랜잭셔널이 있으면 기본적으로 롤백을 해버린다! → @commit 달아주면

쿼리파라미터 로그 남기기 - 스프링 부트 3.0

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

profile
어제보다 나은 오늘

0개의 댓글