ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [링크] Predicate, BooleanExpression의 개념과 차이점
    Stack/Java 2022. 12. 29. 07:57

    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 조건문 정도에 사용하는 걸로 생각된다. 성능에 차이가 있을지도 모르겠다..

    'Stack > Java' 카테고리의 다른 글

    JAVA Stream API 복습(1)  (0) 2023.05.14
Designed by Tistory.