Spring/Querydsl

순수 JPA와 Querydsl

민철킹 2021. 8. 30. 22:17

동적 쿼리와 성능 최적화 조회 - Builder

 

먼저 회원 정보와 소속 팀 정보를 담는 DTO를 생성하고 @QueryProjection을 통해 QType 클래스를 만들어주었다.

 

찾고자하는 회원에 대한 조건이 여기에 담겨서 넘어올 것이다.

 

QType의 DTO가 생성되었기 때문에 위와같이 바로 DTO로 조회를 한다.

 

Querydsl의 BooleanBuilder를 사용해 위와 같이 조건을 설정해주고 위와 같이 Repository의 코드를 구현하였다.

회원 이름과 팀 이름이 조건과 같은, 나이는 AgeGoe<= 나이 <= AgeLoe의 조건으로 검색을 진행한다.

 

해당 조건에 해당되는 member는 member4밖에 없으므로 extracting을 사용해 username 필드의 모든 값을 뽑아낸 뒤 member4가 포함되어 있는지를 검증하였다.

실행된 쿼리

조건에 넣은 것은 팀명, Loe, Goe였고 회원명에는 null이 들어가 동적 쿼리의 조건에 포함되지 않은 것을 확인할 수 있다.

 

 

Where절 파라미터 사용

 

BooleanExpression 타입을 반환하는 조건을 만들어준다.

 

BooleanExpression을 사용하면 조합이 가능하고 재사용이 가능하다. 또한 Builder를 사용할 때보다 가독성도 높아진다.

 

이 또한 위에서 만들어둔 Dto로 바로 조회하도록 하겠다.

 

이 방식을 사용하게되면 아래와 같이 where절에서 바로 조건을 세팅해줄 수 있다.

 

 

이를 사용하는 테스트를 만들어보자.

 

해당 조건에 맞는 회원은 member4 하나이므로 테스트는 통과한다.

 

이 방식의 가장 큰 장점은 재사용이다. 만약 DTO가 아닌 Member로 반환해야할 때도 condition은 그대로 두고 Projection만 변경해주면된다. 또한 각 메서드를 조합하여 사용할 수도 있다.

 

조합해서 사용

 


간단한 조회 API 컨트롤러

 

먼저, local에서 서버를 띄울 때 Member 샘플 데이터를 넣어주도록 하였다.

참고로 Spring의 LifeCycle 때문에 @Transactional과 @PostConstruct를 한번에 사용하지 못하기 때문에 위와 같이 static 클래스를 만들어 분리시켜놓았다.

 

 

"/v1/members"로 요청을 보내면 아무런 조건도 없기 때문에 전체 회원이 조회될 것이다.

 

"/v1/members?teamName=teamB&ageGoe=50"으로 요청을 보내면 팀명이 teamB이고 나이가 50살 이상인 회원이 조회될 것이다.

 

팀명이 teamB & 나이 50이상

 

 

반응형

'Spring > Querydsl' 카테고리의 다른 글

중급 문법  (0) 2021.06.29
기본 문법  (0) 2021.06.18
Querydsl 설정  (0) 2021.06.17
QueryDSL 맛보기  (0) 2021.06.07