본문 바로가기
공부/QueryDSL

QueryDSL 공부하기 - 2

by 고구밍 2022. 5. 11.

Query Dsl
https://velog.io/@youngerjesus/%EC%9A%B0%EC%95%84%ED%95%9C-%ED%98%95%EC%A0%9C%EB%93%A4%EC%9D%98-Querydsl-%ED%99%9C%EC%9A%A9%EB%B2%95

 

우아한 형제들의 Querydsl 사용법

이 글은 "우아한테크콘서트2020 수십억건에서 Querydsl 사용하기" 와 발표자이신 이동욱님의 기술 블로그를 보고 작성한 글입니다. 모든 예제와 추가로 Querydsl 사용 문법은 https://github.com/Youngerjesus/Q

velog.io

 

전 기수 깃허브
https://hanghae99.spartacodingclub.kr/exhibitions/main/5/B

 

항해99

5조 홈트메이트 React / Spring 홈트메이트는 비대면 화상 홈트레이닝 플랫폼입니다. WebRTC 와 SockJS 기술로 *실시간 화상 통화, *실시간 유튜브 공유, *채팅 기능을 구현했으며, 스토리 기능과 스케쥴

hanghae99.spartacodingclub.kr

 

gradle

-> 스프링부트에서 초기에 설정할 수 없고, 부가적으로 설치해야한다.

-> QueryDSL 5.0.0 버젼이 바뀌어서 기존에 제공한 자료에서 수정해야 된다.

 

buildscript {
   ext {
      queryDslVersion = "5.0.0"
   }
}

plugins {
   id 'org.springframework.boot' version '2.6.7'
   id 'io.spring.dependency-management' version '1.0.11.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:${queryDslVersion}"
   annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"

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


   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 {
    querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

 

 

JPQL 

실행을 해야지 문제가 있는지 확인 가능 (런타임 오류 발생)

-> 퇴근한 뒤 사용자가 문제가 있는 기능을 요청해야만 문제를 확인 할 수 있음 ( Bad )

 

QueryDSL 

컴파일 시점 오류를 잡을 수 있음

피라미터 바인딩을 자동으로 해결해준다.

 

package study.querydsl;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import study.querydsl.entity.Member;
import study.querydsl.entity.QMember;
import study.querydsl.entity.Team;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
@Transactional
public class QuerydslBasicTest {

    @PersistenceContext
    EntityManager em;

    JPAQueryFactory queryFactory;

    @BeforeEach
    public void before() {
        queryFactory = new JPAQueryFactory(em);
        Team teamA = new Team("teamA");
        Team teamB = new Team("teamB");

        em.persist(teamA);
        em.persist(teamB);

        Member member1 = new Member("member1", 10, teamA);
        Member member2 = new Member("member2", 20, teamA);
        Member member3 = new Member("member3", 30, teamB);
        Member member4 = new Member("member4", 40, teamB);

        em.persist(member1);
        em.persist(member2);
        em.persist(member3);
        em.persist(member4);

    }

    @Test
    public void startJPQL() {
        //member1을 찾아라.
        String qlString =
                "select m from Member m " +
                        "where m.username = :username";
        Member findMember = em.createQuery(qlString, Member.class)
                .setParameter("username", "member1")
                .getSingleResult();
        assertThat(findMember.getUsername()).isEqualTo("member1");
    }


    @Test
    public void startQuerydsl() {
        QMember m = new QMember("m");

        Member findMember = queryFactory
                .select(m)
                .from(m)
                .where(m.username.eq("member1"))
                .fetchOne();

        assertThat(findMember.getUsername()).isEqualTo("member1");
    }

}

 

 

아직 잘 모르지만 Q클래스라는 친구가 있는데, 앞으로 공부해야되는 부분이다.

 

'공부 > QueryDSL' 카테고리의 다른 글

QueryDSL 공부하기 - 4 ( DTO조회 )  (0) 2022.05.13
QueryDSL 공부하기 - 3  (0) 2022.05.11
QueryDSL 공부하기 - 1  (0) 2022.05.10