BooleanBuilder와 BooleanExpression 모두 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을 사용했다.
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()' 메서드를 연속적으로 사용하는 경우 코드가 길고 복잡해질 수 있다.
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과 뭐가 다른지 차이점만 보자!)