•
build.gradle 설정
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.9'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'org.zerock'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
//테스트를 위해 추가
testCompileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
// 테스트를 위해 추가
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// QueryDsl
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta"
annotationProcessor(
"jakarta.persistence:jakarta.persistence-api",
"jakarta.annotation:jakarta.annotation-api",
"com.querydsl:querydsl-apt:${queryDslVersion}:jakarta")
}
tasks.named('test') {
useJUnitPlatform()
}
compileJava.dependsOn('clean')
Java
복사
•
QTodo
◦
package org.zerock.apiserver.repository.search;
import com.querydsl.jpa.JPQLQuery;
import lombok.extern.log4j.Log4j2;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import org.zerock.apiserver.domain.Todo;
@Log4j2
public class TodoSearchImpl extends QuerydslRepositorySupport implements TodoSearch {
public TodoSearchImpl() {
super(Todo.class);
}
@Override
public Page<Todo> search1() {
log.info("search1................");
QTodo todo = QTodo.todo;
JPQLQuery<Todo> query = from(todo);
query.where(todo.title.contains("1"));
Pageable pageable = PageRequest.of(1, 10, Sort.by("tno").descending());
this.getQuerydsl().applyPagination(pageable, query);
query.fetch(); // 목록 데이터 가져올 때 활용
query.fetchCount(); // Long 타입
return null;
}
}
Java
복사
•
TodoRepository - TodoSearch 추가
package org.zerock.apiserver.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.zerock.apiserver.domain.Todo;
import org.zerock.apiserver.repository.search.TodoSearch;
@Repository
public interface TodoRepository extends JpaRepository<Todo, Long>, TodoSearch {
}
Java
복사
•
TodoSearch 인터페이스 생성
package org.zerock.apiserver.repository.search;
import org.springframework.data.domain.Page;
import org.zerock.apiserver.domain.Todo;
public interface TodoSearch {
Page<Todo> search1();
}
Java
복사
•
TodoSearchImpl 생성 - 여기서는 querydsl 활용하여 쿼리 구성 및 페이징 처리
package org.zerock.apiserver.repository.search;
import com.querydsl.jpa.JPQLQuery;
import lombok.extern.log4j.Log4j2;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import org.zerock.apiserver.domain.Todo;
@Log4j2
public class TodoSearchImpl extends QuerydslRepositorySupport implements TodoSearch {
public TodoSearchImpl() {
super(Todo.class);
}
@Override
public Page<Todo> search1() {
log.info("search1................");
QTodo todo = QTodo.todo;
JPQLQuery<Todo> query = from(todo);
query.where(todo.title.contains("1"));
Pageable pageable = PageRequest.of(1, 10, Sort.by("tno").descending());
this.getQuerydsl().applyPagination(pageable, query);
query.fetch(); // 목록 데이터 가져올 때 활용
query.fetchCount(); // Long 타입
return null;
}
}
Java
복사
•
테스트 코드 작성
@DisplayName("search1 test")
@Test
public void testSearch1() {
// given (사전 준비)
// when (테스트 진행할 행위)
// then (행위에 대한 결과 검증)
todoRepository.search1();
}
Java
복사
•
테스트 결과
2024-08-29T20:08:00.676+09:00 INFO 12285 --- [ main] o.z.a.repository.search.TodoSearchImpl : search1................
Hibernate: select t1_0.tno,t1_0.complete,t1_0.content,t1_0.due_date,t1_0.title from tbl_todo t1_0 where t1_0.title like ? escape '!' order by t1_0.tno desc limit ?,?
Hibernate: select count(t1_0.tno) from tbl_todo t1_0 where t1_0.title like ? escape '!'
SQL
복사