Backend
home
🥁

Querydsl 설정하기

생성일
2025/01/24 05:52
태그
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
인텔리제이 기준 오른쪽 사이드바의 Other 메뉴에서 complie.java 실행
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
복사