[복습] Querydsl - 환경 설정

김주형·2024년 6월 25일
0

Web Basic

목록 보기
47/57
post-thumbnail

개요

  • 가장 많이 사용하는 기술
  • 동적 쿼리 문제도 해결해준다고 합니다

jpql vs querydsl

public void jpql() {
	String username = "kim";
    String query = "select m from Member m" + "where m.username = :username";
    List<Member> result = em.createQuery(query, Member.class).getResultList();
}
  • `Member m where m.username": 띄어쓰기 주의
  • 문법 오류를 자바 컴파일러가 알 수 없으니 실제 실행해봐야 안다고 합니다
public void querydsl() {
	String username = "kim";
    List<Member> result = queryFactory.select(member)
    .from(member)
    .where(member.username.eq(username))
    .fetch();
}
  • 컴파일 오류 시점에서 수많은 오류들을 찾을 수 있습니다 (sql, java 코드 등)
  • java 코드이기 때문에 코드 자동화를 사용할 수 있습니다
  • 코드를 재사용할 수도 있습니다

프로젝트 생성

프로젝트 환경설정

Querydsl 설정과 검증

  • build.gradle에 소스 추가
// buildscript 추가  
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 = '11'  
  
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}"  
  
   compileOnly 'org.projectlombok:lombok'  
   runtimeOnly 'com.h2database:h2'  
   annotationProcessor 'org.projectlombok:lombok'  
  
  
   // 테스트에서 lombok 사용  
   testCompileOnly 'org.projectlombok:lombok'  
   testAnnotationProcessor '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 환경설정 검증

검증용 엔티티 생성

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/querydsl/Tasks/other/compileQuerydsl 버튼을 클릭하여 Querydsl이 잘 실행되는지 체크합니다

성공!

def querydslDir = "$buildDir/generated/querydsl"

build/generated/querydsl이 추가되었습니다

QHello 클래스가 생성되었습니다

검증용 Q 타입 생성

  1. Gradle Intellij 사용 방법
  • Gradle → Tasks → build → clean 클릭
  • Gradle → Tasks → other → compileQuerydsl 클릭
  1. Gradle 콘솔 사용법
    ./gradlew clean compileQuerydsl 실행
    ./gradlew clean 실행할시, 검증용 Q 타입 제거

1,2 중 하나를 실행할시 QHello 클래스가 생성됩니다

테스트케이스로 실행 검증

@Transactional  
@SpringBootTest  
class QuerydslApplicationTests {  
  
   @Autowired  
   EntityManager em;  
  
   @Test  
   void contextLoads() {  
      Hello hello = new Hello();  
      em.persist(hello);  
  
      JPAQueryFactory query = new JPAQueryFactory(em);  
      QHello qHello = QHello.hello; //Querydsl Q타입 동작 확인  
  
      Hello result = query  
            .selectFrom(qHello)  
            .fetchOne();  
  
      assertThat(result).isEqualTo(hello);  
      //lombok 동작 확인 (hello.getId()     
		assertThat(result.getId()).isEqualTo(hello.getId());  
   }  
  
}

참고

  • 스프링 부트에 아무런 설정도 하지 않으면 h2 DB를 메모리 모드로 JVM안에서 실행합니다

라이브러리 살펴보기

  • gradle 의존관계 살펴보기
    /gradlew dependencies --configuration compileClasspath

  • querydsl-apt: Querydsl 관련 코드 생성 기능 제공
  • querydsl-jpa: querydsl 라이브러리

  • querydslSourcesDir = querydslDir, main.java.srcDir querydslDir : id들이 자동으로 자기 소스폴더에 import 됩니다

스프링 부트 설정 - JPA, DB

application.yml

spring:  
  datasource:  
    url: jdbc:h2:tcp://localhost//Users/leekyoungchang/Desktop/Study/Computer/Spring/JPA(pdf, ppt)/Querydsl/db/querydsldb  
    username: sa  
    password: 1234  
    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  
#  org.hibernate.type: trace

spring.jpa.hibernate.ddl-auto: create: 이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성합니다

모든 로그 출력은 가급적 로거를 통해 남겨야합니다

  • show_sql : System.out에 하이버네이트 실행 SQL을 남깁니다
  • org.hibernate.SQL : logger를 통해 하이버네이트 실행 SQL을 남깁니다

쿼리 파라미터 로그 남기기

Querydsl 설정과 검증

라이브러리 살펴보기

H2 데이터베이스 설치

스프링 부트 설정 - JPA, DB


예제 도메인 모델

동작 확인

profile
도광양회

0개의 댓글