BooleanExpression은 Java나 Spring과 같은 환경에서 주로 사용하는 Boolean 값을 반환하는 논리 표현식을 의미합니다. 이는 논리적인 조건을 표현하거나 필터링에 사용되며, 특히 Querydsl 라이브러리에서 많이 사용됩니다.
Querydsl은 타입-안전하고 동적 SQL 쿼리를 작성하기 위한 도구로, BooleanExpression은 쿼리의 조건을 표현하는 데 사용됩니다.
타입 안전: 쿼리를 작성할 때 컴파일 타임에 오류를 발견할 수 있습니다.
체이닝 가능: 여러 조건을 결합하여 복잡한 논리 표현을 작성할 수 있습니다.
동적 쿼리 지원: 조건이 필요에 따라 추가되거나 제거될 수 있습니다.
주요 메서드
BooleanExpression은 다양한 메서드를 제공하여 논리적 조건을 쉽게 작성할 수 있습니다. 대표적인 메서드는 다음과 같습니다.
and(): 조건을 AND로 결합
or(): 조건을 OR로 결합
not(): 조건을 NOT으로 반전
// Q 클래스는 Querydsl에서 생성된 엔티티 클래스입니다.
QUser user = QUser.user;
// 특정 조건 생성
BooleanExpression isAdult = user.age.goe(18);
BooleanExpression isFromSeoul = user.city.eq("Seoul");
// 조건 결합
BooleanExpression condition = isAdult.and(isFromSeoul);
// 결합된 조건을 쿼리에 적용
List<User> result = queryFactory
.selectFrom(user)
.where(condition)
.fetch();
특정 기간 동안 가입한 사용자를 필터링하는 예제입니다.
QUser user = QUser.user;
// 날짜 조건 생성
LocalDate startDate = LocalDate.of(2024, 1, 1);
LocalDate endDate = LocalDate.of(2024, 12, 31);
BooleanExpression condition = user.createdDate.between(startDate, endDate);
// 쿼리 실행
List<User> users = queryFactory
.selectFrom(user)
.where(condition)
.fetch();
아래와 같이 단순 boolean 값으로 조건을 작성하면 컴파일 에러가 발생합니다.
boolean isAdult = true; // 단순 boolean 값
BooleanExpression condition = user.age.goe(18).and(isAdult); // 컴파일 에러 발생
오류 이유: and 메서드는 BooleanExpression 타입을 받아야 하는데, boolean 타입을 제공했기 때문입니다.
Java 기본 데이터 타입으로, 논리값(true 또는 false)을 나타냅니다.
역할: 프로그램 내에서 단순히 논리적 참/거짓을 표현하고 조건문(if, while 등)에서 사용됩니다.
boolean isAdult = true;
boolean isVip = false;
if (isAdult && isVip) {
System.out.println("This user is an adult and a VIP.");
}

BooleanBuilder는 Querydsl에서 제공하는 동적 조건 생성 도구입니다.
기능: 조건을 동적으로 추가하거나 수정할 수 있습니다.
특징:
QUser user = QUser.user;
// 동적 조건 생성
BooleanBuilder builder = new BooleanBuilder();
// 조건 추가
builder.and(user.age.goe(18)); // 나이가 18 이상
builder.and(user.isVip.isTrue()); // VIP인 조건
// 동적 조건
boolean includeInactiveUsers = false;
if (includeInactiveUsers) {
builder.or(user.isActive.isFalse()); // 비활성 사용자도 포함
}
// 쿼리 실행
List<User> users = queryFactory
.selectFrom(user)
.where(builder)
.fetch();
