Predicate, BooleanExpression 개념
뭐냐
BooleanExpression 클래스는 자바8 문법이다. 조건문을 담을 수 있고, 담은 조건문을 다른 곳에서 활용할 수 있다.
왜쓰냐
조건문이 null일수도 있다. 단순 Builder를 쓰면 문법도 보기 좋지 않고 무슨 조건절인지 한눈에 파악이 어렵다.
BooleanBuilder builder = new BooleanBuilder();
if(XxxRepository.getMemberId() != null) {
builder.and(....)
}
이런식으로 BooleanBuilder에 조건절을 if문을 통해서 하나하나 검사하고, and 메서드로 조건절들을 추가한다. 그리고 완성된 BooleanBuilder를 쿼리문의 조건절에 넣는데, 조건이 복잡하고 경우의 수가 많으면 작업량도 많고 이해도 어려울 것이다. A B 2개 조건에 대해 검사한다고만 생각하더라도, (A 참, B 거짓), (A 거짓, B 참), (A 참, B 참), (A 거짓, B 거짓)의 경우를 다 검사해야할지도 모른다..
어떻게 쓰냐
예를들어, 아래와 같이 JPA의 where 절에서 BooleanExpression 또는 Predicate[] 을 쓸 수 있다. 21번줄의 makeExpressions의 where절은 조건들이 null이 아닐때는 where절을 적용하지만, 조건들이 null 일때는 21번줄 where절을 무시할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public BooleanExpression[] makeExpressions(List<Long> memberIdList, Integer statusCode) {
return new BooleanExpression[]{xxxEntity.wId.in(wIds)
, xxxEntity.statusCode.ne(xxxStatus.DELETE.getCode())
, (xxxEntity.bId.notIn(Bxx.getbId()).or(
xxxEntity.bId.isNull()
)
)};
}
...
QueryResults<XxxDto> results = jpaQueryFactory
.select(
....
)
.from( ... )
.where(makeExpressions)
.where(기본 조건문들)
.fetch();
|
cs |
Predicate, BooleanExpression 차이
BooleanExpression은 Predicate의 구현체이다. 참조1)에 따르면 BooleanExpression은 null 일때 무시될 수 있고, and또는 or절을 통해서 조합을 할 수 있다. Predicate는 단순 true or false 조건문 정도에 사용하는 걸로 생각된다. 성능에 차이가 있을지도 모르겠다..
참조
1) 우아한 형제들의 Querydsl 사용법
'Programming-[Backend] > Java' 카테고리의 다른 글
[TIL][TDD] 테스트 코드 기반으로 짜되, service 코드에서 의미적으로(기능적으로) 분리해가며 작성하기 (0) | 2021.11.09 |
---|---|
[TIL]자바 리스트 중복 항목만 추출 : indexOf, lastIndexOf, HashSet 활용 (0) | 2021.10.13 |
[패턴][TIL] HashSet으로 자바 List String 중복검사, equals, hashCode Override (2) | 2021.10.07 |
[링크] 자바 final 요약 (0) | 2021.05.30 |
[TIL] ENUM 값 정의하고 불러오기 (2) | 2021.05.17 |