[Spring boot] BooleanBuilder와 BooleanExpression의 차이

myminimin·2023년 9월 15일
0

Spring/Springboot

목록 보기
14/21

BooleanBuilderBooleanExpression 모두 Querydsl 라이브러리에서 제공하는 기능으로, 데이터베이스 쿼리를 동적으로 생성하기 위해 사용한다.

선택은 개발자의 취향과 코드 구성에 따라 다를 수 있다는데... 둘의 차이점에 대해서 검색을 해보니 'BooleanExpression을 쓰는게 가독성, 재사용성이 좋아서 무조건 써야한다' 는 글들이 많았다. 와중에 또 어떤 사람은 BooleanBuilder를 써야한다는 사람도 있고...

학습을 하면서 느낀 건데 BooleanBuilder는 다중 조건 처리를 할 때, '()'가 들어가는 상황에서 좋고 BooleanExpression은 단순한 쿼리나 단일 조건일 때쓰면 좋은 것 같았다.

예를 들자면 이런 경우이다!

private BooleanBuilder getSearch(PageRequestDTO requestDTO){
    QGuestbook qGuestbook = QGuestbook.guestbook;
    String type = requestDTO.getType();
    String keyword = requestDTO.getKeyword();
    
    // 1. 검색 조건(type)이 있는 경우에는 conditionBuilder 변수를 생성해서 각 검색 조건을 'or'로 연결해서 처리
    BooleanBuilder conditionBuilder = new BooleanBuilder();
    
    if(type != null && !type.trim().isEmpty()) {
        if(type.contains("t")){
            conditionBuilder.or(qGuestbook.title.contains(keyword));
        }
        if(type.contains("c")){
            conditionBuilder.or(qGuestbook.content.contains(keyword));
        }
        if(type.contains("w")){
            conditionBuilder.or(qGuestbook.writer.contains(keyword));
        }
    }
    
    // 2. 검색 조건이 없으면 'gno > 0' 으로만 생성
    BooleanExpression expression = qGuestbook.gno.gt(0L);
    
    // 모든 조건들을 통합
    BooleanBuilder booleanBuilder = new BooleanBuilder();
    booleanBuilder.and(expression).and(conditionBuilder);
    
    return booleanBuilder;
}

이렇게 여러 조건을 결합하고 논리적인 연산을 수행할 때는 BooleanBuilder를 사용해서 복잡한 검색 조건을 구성하고

'BooleanExpression expression = qGuestbook.gno.gt(0L);' 와 같은 단일 조건을 생성할 때는 BooleanExpression을 사용했다.


  • 만약 BooleanExpression을 ()를 이용해야하는 복잡한 쿼리에 사용하면
QPerson person = QPerson.person;
BooleanExpression condition1 = person.age.between(25, 35);
BooleanExpression condition2 = person.salary.gt(50000);
BooleanExpression condition3 = person.department.eq("Engineering");
BooleanExpression condition4 = person.city.eq("New York");

// 복잡한 조건 조합
BooleanExpression complexCondition = condition1
    .and(condition2)
    .and(condition3)
    .or(condition4);

각각의 조건을 만들고 이를 and()와 or() 메서드를 사용해서 복합으로 사용하는데 간단한 경우에는 유용할 수 있지만 쿼리가 더 복잡해지면 가독성이 떨어질 수 있다.

특히, 여러 개의 'and()' 및 'or()' 메서드를 연속적으로 사용하는 경우 코드가 길고 복잡해질 수 있다.

  • BooleanBuilder를 사용하는 경우에는
QPerson person = QPerson.person;
BooleanBuilder builder = new BooleanBuilder();

builder.and(person.age.between(25, 35))
       .and(person.salary.gt(50000))
       .and(person.department.eq("Engineering"))
       .or(person.city.eq("New York"));

모든 조건을 하나로 통합해서 코드의 가독성이 향상된다!

(사실 둘 중에 하나만 극단적으로 사용하는 것보다는 섞어서 쓰는 편이 훠얼씬 좋은 것 같다... 이 예시도 and, or가 많아서 썩 좋지는 않지만 BooleanExpression과 뭐가 다른지 차이점만 보자!)

0개의 댓글