본문 바로가기

QueryDSL

[Query DSL] 프로젝트 세팅 ( import 인식 문제 확인 )

 

 


build 폴더안에 있는 내용이 자동으로 import  IDE 설정에서 Build, Execution, Deployment > Build Tools > Gradle에서

Build and run using이 gradle로 설정되어 있는지 확인해야 한다.

 

만약 잘 안된다면 IDE 설정이 꼬여서 그럴 수 있습니다. 이런 경우에는 IDE를 종료하고, 프로젝트 폴더에 숨겨져 있는 .idea 폴더를 삭제해주세요. 그리고 프로젝트를 처음부터 다시 import 해주세요.

 

 

Build and run using (IntelliJ IDEA) - import 인식 X

 

Build and run using (Gradle) - import 인식 O

 

중요!!!

 

 

Querydsl 부트 3.x 설정

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.5'

}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(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'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

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

    //test 롬복 사용
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'

    //Querydsl 추가
    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 설정부
//def generated = 'src/main/generated'
//
//// querydsl QClass 파일 생성 위치를 지정
//tasks.withType(JavaCompile) {
//    options.generatedSourceOutputDirectory = file(generated)
//}
//
//// java source set 에 querydsl QClass 위치 추가
//sourceSets {
//    main.java.srcDirs += "$projectDir/build/generated"
//}
//
//// gradle clean 시에 QClass 디렉토리 삭제
//clean {
//    delete file(generated)
//}

// gradle clean 시에 QClass 디렉토리 삭제
clean {
    delete file('src/main/generated')
}

 

Test

package com.example.querytest.controller;

import com.example.querytest.entity.Hello;

import com.example.querytest.entity.QHello;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Transactional
class HelloControllerTest {

    @Autowired
    EntityManager em;

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

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


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

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

}

 

Spring Boot 애플리케이션에서 테스트를 작성할 때, 수동으로 트랜잭션을 관리할 필요가 없습니다. 대신 @Transactional 어노테이션을 사용하여 자동으로 트랜잭션을 관리할 수 있습니다. 이렇게 하면 EntityTransaction tx와 수동 트랜잭션 관리를 할 필요가 없어집니

Querydsl이란 무엇인가?

Querydsl은 Java 기반의 데이터베이스 쿼리 작성 도구입니다. 객체 지향적인 방식으로 SQL, JPA, MongoDB 쿼리를 생성할 수 있도록 지원합니다. Querydsl을 사용하면 Java 코드에서 직접적으로 타입 안전한 쿼리를 작성할 수 있어 컴파일 시점에 쿼리의 오류를 확인할 수 있습니다.

Querydsl을 사용하는 이유

  1. 타입 안전성:
    • Querydsl은 타입 안전한 쿼리 작성을 가능하게 합니다. 이는 컴파일 시점에 쿼리 오류를 확인할 수 있어 런타임 오류를 줄이는 데 도움이 됩니다.
  2. 가독성:
    • Querydsl은 Java 코드와 유사한 문법을 사용하여 쿼리를 작성하므로, 쿼리의 가독성이 향상됩니다. 이는 유지보수 및 협업에 큰 도움이 됩니다.
  3. 자동 완성 지원:
    • IDE에서 코드 자동 완성을 지원하여 쿼리를 작성하는 속도와 정확도를 높일 수 있습니다.
  4. 동적 쿼리 작성:
    • 조건에 따라 동적으로 쿼리를 작성할 수 있어 복잡한 쿼리도 쉽게 처리할 수 있습니다.
  5. 다양한 데이터베이스 지원:
    • SQL, JPA, MongoDB 등 여러 데이터베이스를 지원하므로, 다양한 환경에서 Querydsl을 사용할 수 있습니다.

 

application.yml

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

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
#        show_sql: true
        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug
#    ort.hibernate.type: trace

 

 

  • org.hibernate.SQL: debug: Hibernate가 실행하는 SQL 쿼리를 디버그 수준에서 로그로 출력합니다.
  • org.hibernate.type: trace: Hibernate가 SQL 쿼리에 사용하는 파라미터 값을 트레이스 수준에서 로그로 출력합니다.

P6Spy는 데이터베이스 쿼리를 로깅하고 모니터링할 수 있는 라이브러리입니다.

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