Spring

JPA - Querydsl 정의(간단한 검색기능)

jaewoo 2022. 9. 3. 14:39

이 내용은 자바웹 개발 워크북을 학습후 정리한 내용입니다.

 

기본적으로 JPA나 JPQL을 이용하면 SQL을 작성하거나 쿼리를 처리하는 소스 부분이 줄어들기 때문에 무척 편리하다. 하지만 애노테이션을 이용해서 지정하기 때문에 고정된 형태라는 단점이 있다.

그리고 복합적인 조건이 걸릴 수 있는데 이런 상황에서 매우 까다롭기 때문에 Querydsl을 사용하는 것이 좋은 경우가 많다.

 

 

Querydsl 사용을 위한설정

 

Q 도메인 클래스를 만들기 위한 설정이다.  Querydsl은 Entitiy가 아닌 Q  도메인 클래스를 사용한다.

compileJava를 실행하면 이제 Q 도메인 클래스가 생성된 걸 확인 할 수 있다.

기존에 사용중이던 Repository와 Querydsl 연동하는 3가지 단계

  1. Querydsl을 사용할 인터페이스를 먼저 구현한다.
  2. 위에서 지정한 인터페이스 이름 +Impl 형태로 클래스를 선언한다. 이떄 이 구현체 클래스는 QuerydslRepositorySupport를 상속받아야한다. 
  3. 기존의 사용중이던 JpaRepository에 부모 인터페이스로 1에서 만든 인터페이스를 추가한다.

 

위에 3단계를 코드로 본다면

1번 인터페이스를 먼저 정의한다.

 

2번 QuerydslRepositorySuppot를 상속받는 구현체를 구현한다. 여기서 구현체 이름은 "인터페이스 이름+Impl" 이 되어야한다.

 

3번 사용중인 JpaRepoisotry 인터페이스에서 1번에서 구현한 인터페이스를 상속 받는다.

 

이제 Querydsl 기능은 모두 BoardSearchImpl (BoardSearch 구현체) 에 정의하면 된다.

일단 처음으로 위에서 말했듯이 여기서는 엔티티가 아닌 Q도메인 클래스를 사용한다. 

JPQLQuery <엔티티타입> 을 사용하여 쿼리를 받을 수 있다.

from() 메소드는 select * from board와 마찬가지이다.

밑에 booleanBuilder는 여러가지 or 조건을 걸기위해 사용한 것이다,

이 조건들을 where 메소드를 통해 전부 넣을 수 있다.

파라미터로 받는 Predicate는 예상하다는 뜻에 단어를 사용하고 true/false 값을 넣어주면 된다. 그리고 ... 을 통해 가변인자를 받을 수 있다. 이 전체 코드에서처럼 BooleanBuilder를 통해 받을 수도 있다는 뜻이다.

 

this.getQuerydsl().applyPagination(pageable,query)

중간에 보면 이런 코드가 보이는데 이 코드는 QuerydslRepositorySupport에 기능을 사용한 것이다 Querydsl로 Pageable 을 처리한 방법이다.

그리고 fetch() 메소드는 List형태로 쿼리를 실행한 결과를 반환한다. fetchCount()는 SQL에서 count()에 결과 즉 데이터 개수를 반환한다.

 

리턴 타입인 new PageImpl은 List타입을 Page 타입으로 바꿔서 보내기 위해 사용했다. 근데 같이 넘겨줘야 할 값이 데이터와 pageable 그리고 count를 같이 넘겨줘야한다.

 

테스트

 

검색 조건을 조금 수정한다. 수정후 테스트 코드

SQL 결과를 보면 like 를 통해 결과가 실핸된 걸 볼 수 있다.

'Spring' 카테고리의 다른 글

JPA - N+1  (0) 2022.09.19
JPA - @EntitiyGraph, @Transactional Database - NoSession 해결  (0) 2022.09.15
JSP/Spring (Mybatis - Mariadb) Paging 구현  (2) 2022.08.31
PRG(Post-Redirect-GET) 패턴  (0) 2022.08.22
Springboot(JPA)-Page 구현  (0) 2022.08.21