동글이기가 레포

QuerySQL은 [SELECT * FROM TABLE;] 과 같은 쿼리를 java코드로 구현할 수 있는 기술이다.

복잡한 쿼리들도 구현이 가능한데, Spring Data JPA에서는 그것이 힘들었다.

 

그리고 java코드로 구현하기 때문에 컴파일 시 java코드로 구현한 쿼리에 대한 오류를 사전에 해소할 수 있다.

 

아래는 QueryDSL을 사용하기 위해 build.gradle을 세팅해준 것이다.

//queryDSL이라고 되어 있는 부분이 해당한다.

// queryDSL
buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}

plugins {
    id 'org.springframework.boot' version '2.6.6'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    // queryDSL
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
    id 'java'
}

group = 'toy'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

// queryDSL
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}

repositories {
    mavenCentral()
}

dependencies {
    // monitoring
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    // jdbc
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    // jpa
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    // spring security
    implementation 'org.springframework.boot:spring-boot-starter-security'
    // spring boot
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-web-services'
    // db
    runtimeOnly 'com.h2database:h2'
    // test
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
    // queryDSL
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    annotationProcessor(
            "javax.persistence:javax.persistence-api",
            "javax.annotation:javax.annotation-api",
            "com.querydsl:querydsl-apt:${queryDslVersion}:jpa")

}

// queryDSL
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
    library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslDefault = true
    querydslSourcesDir = querydslDir
}
sourceSets {
    main.java.srcDir querydslDir
}
compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}
compileQuerydsl.doFirst {
    if (file(querydslDir))
        delete(file(querydslDir))
}
tasks.withType(JavaCompile){
    options.generatedSourceOutputDirectory = file(querydslDir)
}
clean.doLast {
    delete file(querydslDir)
}
/////////////

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



기본적인 설정을 마쳤다.

조금 뜯어보면 알겠지만, QueryDSL은 user라는 엔티티가 있으면 Quser라는 것을 만든다.

그러나, 이렇게 생성된 Q 파일들은 git이나 다른 형상관리를 할 때 포함을 하면 안된다.

application.properties파일을 통해 수동으로 만들어주었기 때문에 능동적이지가 못한데, 만약 버전등에 차이가 생길경우 세부 내용이 변경될 수가 있다.

 

 

QueryDSL을 사용해보기전에 JPQL에 대해 간단하게 짚고 넘어가야한다.

 

JPQL이 필요한 이유는, 기존의 JPA는 기본적인 SQL을 처리해주기 때문에 쿼리를 직접 사용할 필요가 없었다.

그러나, JPA는 하나의 테이블을 대상으로 했을때에만 가능한 이야기였고, 특정 데이터를 활용해야 할 때에도 테이블 전체를 가져오기 때문에 효율적이지 못했다.

이러한 문제를 해결하기 위해 JPQL(Java Persistence Query Language)라는 쿼리 언어를 사용했다.

쿼리가 작성될 때, SQL은 테이블 대상으로 작성되고 JPQL은 엔티티 객체를 대상으로 쿼리가 작성된다.

 

아래는 간단한 JPQL의 예시이다.

List users = em.createQuery("select u from User u", User.class).getResultList();

조금 어렵게 보인다.

사람에 따라 다르겠지만, QueryDSL은 JPQL의 빌더 역할을 하는 오픈소스로서 좀 더 직관적으로 표현할 수 있다.

QUser qUser = QUser.user;
User user = queryFactory
		.select(qUser)
		.from(qUser)
		.orderBy(qUser.id.asc())
		.fetchFirst();

이렇게 만들어진 QueryDSL 코드는 결과적으로는 JPQL이 된다.

 

실행되는 JPQL을 보고 싶으면 application.properties에 아래를 추가하면 된다.

spring.jpa.properties.hibernate.use_sql_comments: true

 

'스터디 > 동기 Java 스터디' 카테고리의 다른 글

9주차 : 람다식  (0) 2021.05.26
9주차 : 제네릭  (0) 2021.05.23
8주차 : I/O  (0) 2021.05.19
8주차 : 애노테이션  (0) 2021.05.17
7주차 : Enum  (0) 2021.05.13

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading