SpringBoot 쇼핑몰 만들기

[여섯 번째 기록] Querydsl

여행하는 개발자(SOO) 2022. 11. 10. 17:13
728x90

Querydsl

SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
JPA Criteria에 비해서 편리하고 실용적이다

 

1. Querydsl 장점

  • 고정된 SQL문이 아닌 동적으로 쿼리를 생성할 수 있다.
  • 쿼리 재사용 제약 조건 조립 및 가독성 향상
  • 문자열X 자바 소스코드로 작성 -> 컴파일 시점에서 오류 발견 가능
  • IDE의 도움으로 자동완성이 가능 -> 생산성 향상

 

2 build.gradle 설정

  • 사용하기에 앞서 몇 가지 설정이 필요하다.
// 1. queryDsl version 정보 추가
buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}

plugins {
	id 'org.springframework.boot' version '2.7.4'
	id 'io.spring.dependency-management' version '1.0.14.RELEASE'
	// 2. querydsl plugins 추가
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
	id 'java'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	// 3. querydsl dependencies 추가
	implementation "com.querydsl:querydsl-jpa:5.0.0"
	annotationProcessor "com.querydsl:querydsl-apt:5.0.0"
	//...
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.session:spring-session-core'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	//spy6
	implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.7.1'

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'mysql:mysql-connector-java'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

/**
 * querydsl 추가 시작
 */

// querydsl에서 사용할 경로 설정
def querydslDir = "$buildDir/generated/querydsl"
// JPA 사용 여부와 사용할 경로를 설정
querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}
// build 시 사용할 sourceSet 추가
sourceSets {
	main.java.srcDir querydslDir
}
// querydsl 이 compileClassPath 를 상속하도록 설정
configurations {
	querydsl.extendsFrom compileClasspath
}
// querydsl 컴파일시 사용할 옵션 설정
compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

 

1. querydsl version 정보 추가

Querydsl 버전 정보 추가

 

2. querydsl plugin 추가

Querydsl pugin 추가

 

3. querydsl dependencies 추가

Querydsl 의존성 주입

 

4. querydsl 설정 추가

Querydsl 설정

 

3. compileQuerydsl 실행

  • gradle설정이 완료되었다면 Reload Gradle Project를 실행

gradle Reload

 

  • Gradle Tasks -> other -> compileQuerydsl 실행 

compileQuerydsl 실행

 

4. QClass 생성 확인

  • 실행이 완료되면 build/generated/querydsl 경로에 Project Entity 들의 QClass 가 생성된 것을 확인할 수 있다.

QClass

 

5. Querydsl 테스트

  • JPAQuery에서 결과를 반환하는 메서드
메소드 기능
List <T> fetch() 조회 결과 리스트 반환
T fetchOne 조회 대상이 1건인 경우 제네릭으로 지정한 타입 반환
T fetchFirst() 조회 대상 중 1건만 반환
Long fetchCount() 조회 대상 개수 반환
QueryResult<T> fetchResults() 조회한 리스트와 전체 개수를 포함한 QueyrResults 반환

 

  • 영속성 컨텍스트 사용을 위해 @PersistenceContext 어노테이션으로 EntityManager 빈을 주입

EntityManager 빈 주입

 

  • JPAQueryFactory를 이용 동적 쿼리를 생성(생성자 파라미터로 EntityManager 객체 주입)
  • Querydsl로 쿼리 생성을 위해 Q객체 이용
  • Querydsl을 이용하여 자바 소스코드이지만 SQL 비슷하게 쿼리 작성 가능
  • JPAQuery 메서드 중 하나인 fetch() 사용 ㅡ> 리스트로 결과 반환
  • fetch() 메소드 실행 시점에 쿼리문이 실행된다.

JPAQueryFactory에 EntityManager주입 및 쿼리 생성

 

  • 결과 코드
    • where절에 추가한 판매상태 코드와 상품 상세 설명이 보인다.
    • 상품 가격으로 내림차순 정렬돼 데이터를 조회한다.

결과 코드

728x90