Programming-[Backend]/Java

[TIL][링크] Predicate, BooleanExpression의 개념과 차이점

컴퓨터 탐험가 찰리 2021. 8. 25. 15:38
728x90
반응형

 

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 사용법

 

https://velog.io/@youngerjesus/%EC%9A%B0%EC%95%84%ED%95%9C-%ED%98%95%EC%A0%9C%EB%93%A4%EC%9D%98-Querydsl-%ED%99%9C%EC%9A%A9%EB%B2%95

728x90
반응형