오봉이와 함께하는 개발 블로그
Querydsl - 설정, 예제 도메인 모델 본문
728x90
설정
- 사용 기능
- Spring Web
- JPA
- H2 DB
- lombok
build.gradle
Spring Boot 2.6, Querydsl 5.0 이상부터 설정 방법이 바뀌었기 때문에 현재 버전에 맞춰 설정했다.
//querydsl 추가
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
id 'org.springframework.boot' version '2.7.3'
id 'io.spring.dependency-management' version '1.0.13.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'
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 {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝
검증용 엔티티 생성
@Entity
@Getter
@Setter
public class Hello {
@Id @GeneratedValue
private Long id;
}
검증용 Q 타입 생성
- Gradle -> Tasks -> build -> clean
- Gradle -> Tasks -> other -> compileQuerydsl
혹은 콘솔(터미널)에서
- ./gradlew clean
- ./gradlew compileQuerydsl
위 프로세스를 실행하면 build
-> generated
-> querydsl
에 study.querydsl.entity.QHello.java 파일이 생성되어 있어야 한다.
참고로 Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다.
대부분 gradle build 폴더를 git에 포함하지 않는데, 설정에서 생성 위치를 gradle build 폴더 아래 생성되도록 했기 때문에 이 부분도 자연스럽게 해결된다.
package study.querydsl.entity;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;
/**
* QHello is a Querydsl query type for Hello
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QHello extends EntityPathBase<Hello> {
private static final long serialVersionUID = 1910216155L;
public static final QHello hello = new QHello("hello");
public final NumberPath<Long> id = createNumber("id", Long.class);
public QHello(String variable) {
super(Hello.class, forVariable(variable));
}
public QHello(Path<? extends Hello> path) {
super(path.getType(), path.getMetadata());
}
public QHello(PathMetadata metadata) {
super(Hello.class, metadata);
}
}
테스트 케이스로 실행 검증
@SpringBootTest
@Transactional
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타입 동작 확인
// public static final QHello hello = new QHello("hello"); <- QHello.java에 있는 코드
Hello result = query.selectFrom(qHello)
.fetchOne();
Assertions.assertThat(result).isEqualTo(hello);
//lombok 동작 확인 (hello.getId())
Assertions.assertThat(result.getId()).isEqualTo(hello.getId());
}
}
application.properties
spring.datasource.url=jdbc:h2:tcp://localhost/~/querydsl
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=create
#spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=debug
#logging.level.org.hibernate.type=trace
- spring.jpa.hibernate.ddl-auto=create
- 이 옵션은 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.
모든 로그 출력은 가급적 로거를 통해 남겨야 한다.show_sql
: System.out 에 하이버네이트 실행 SQL을 남긴다.org.hibernate.SQL
: logger를 통해 하이버네이트 실행 SQL을 남긴다.
쿼리 파라미터 로그 남기기
- 로그에 다음을 추가
org.hibernate.type
- SQL 실행 파라미터를 로그로 남긴다.
- 외부 라이브러리 사용
build.gradle
에 다음 추가
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'
쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 된다. 하지만 운영시스템에 적용하려면 꼭 성능테스트를 하고 사용하는 것이 좋다.
예제 도메인 모델과 동작확인
https://5bong2-develop.tistory.com/431
위 링크와 같은 도메인 모델을 사용한다.
인프런 김영한 지식공유자님 강의 : 실전! Querydsl
728x90
'BE > JPA' 카테고리의 다른 글
Querydsl - 기본 Q-Type 활용 (0) | 2022.09.15 |
---|---|
Querydsl - JPQL vs Querydsl (0) | 2022.09.15 |
스프링 데이터 JPA - 네이티브 쿼리 (0) | 2022.09.14 |
스프링 데이터 JPA - Projections (0) | 2022.09.14 |
스프링 데이터 JPA - 새로운 엔티티를 구별하는 방법 (0) | 2022.09.14 |
Comments