ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #QueryDSL - 0
    QueryDSL 2021. 3. 29. 11:43

    최신 JAVA BACKEND 기술은 스프링 부트 + 스프링 데이터 JPA 를 조합해서 사용.

     

    하지만 이 것으로도 해결하지 못하는 문제가 있다.

     

    문제

    1. 복잡한 쿼리 

    2. 동적 쿼리

     

     이런 문제들을 해결해줄수 있는것이 Querydsl이다.

     

    Querydsl

    1.쿼리를 문자가아니라 자바코드로 작성 문법 오류를 컴파일 시점에 해결

    2.동적 쿼리 문제 해결

    3.쉬운 SQL 스타일 문법

    4.자바코드이기 때문에 메소드로 재사용성

     

     

    Querydsl + Querydsl

    단순 반복X

    쿼리도 자바 코드로!

     

     

     

    lombok setting 

    settings Build complierAnnoation  Processors - Enable annotation processing을 체크 후 재시작

    Querydsl setting

     

    build.gradle

    querydsl 용 plugin

     

    querydsl 용 libarary

    source code

    plugins {
     id 'org.springframework.boot' version ‘2.2.2.RELEASE'
     id 'io.spring.dependency-management' version '1.0.8.RELEASE'
     //querydsl 추가
     id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
     id 'java'
    }
    group = 'study'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    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'
     compileOnly 'org.projectlombok:lombok'
     runtimeOnly 'com.h2database:h2'
     annotationProcessor 'org.projectlombok:lombok'
     testImplementation('org.springframework.boot:spring-boot-starter-test') {
     exclude group: ‘org.junit.vintage’, module: ‘junit-vintage-engine'
     }
    }
    test {
     useJUnitPlatform()
    }
    //querydsl 추가 시작
    def querydslDir = "$buildDir/generated/querydsl"
    querydsl {
     jpa = true
     querydslSourcesDir = querydslDir
    }
    sourceSets {
     main.java.srcDir querydslDir
    }
    configurations {
     querydsl.extendsFrom compileClasspath
    }
    compileQuerydsl {
     options.annotationProcessorPath = configurations.querydsl
    }
    //querydsl 추가 끝

     

    Querydsl 검증

     

    검증 Entity 생성

    package study.querydsl.entity;
    
    import lombok.Getter;
    import lombok.Setter;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    @Getter @Setter
    public class Hello {
    
       @Id @GeneratedValue
       private Long id;
     
    }
    

    우측 상단 gradle -> task-> other->compileQuerydsl 더블클릭
    plugin이랑 맞물려서 빌드될떄 configurations안에 넣고 컴파일될때 anntationProcessor가 같이 돌면서 qfile을 생성하는 것이다. 

    build → generated →프로젝트패키지→QHello가 정상적으로 생성된 것을 볼 수 있다.

     

    테스트를 통해 검증

    @Test
    	void contextLoads() {
    		Hello hello = new Hello();
    		em.persist(hello);
    
    		JPAQueryFactory query = new JPAQueryFactory(em);
    		QHello qHello = new QHello("h");
    
    		Hello result = query
    				.selectFrom(qHello)
    				.fetchOne();
    
    		assertThat(result).isEqualTo(hello);
    		assertThat(result.getId()).isEqualTo(hello.getId());
    
    	}

    정상 동작 확인

     

    Querydsl 라이브러리

    querydsl-apt  → code generated안에 QHello 같은 것을 만드는 용도로 사용

    querydsl-jpa   실제 querydsl core가 있는데 실제 코드짤떄 사용하는 라이브러리(ex .selectfrom())

     

    댓글

Designed by Tistory.