본문 바로가기

Spring Boot/Spring Data JPA

QueryDsl) BooleanExpression

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

 

// booleanBuilder
QMember member = new QMember("member");

public List<Member> findAllMember(Integer class, String name) {
    BooleanBuilder builder = new BooleanBuilder();
    if (!StringUtils.isEmpty(name)) {
        builder.and(member.name.eq(name));
    }
    if (class != null) {
        builder.and(member.class.id.eq(class));
    }

    return jpaQueryFactory
            .select(member)
            .from(member)
            .where(builder)
            .fetch();
}

 

BooleanExpression 과 BooleanBuilder 둘 사이에 성능차이는 없지만 BooleanBuilder

같은 메소드 안에서 if문으로 조건을 비교 후 BooleanBuilder에 값을 더해준다.

 

상황에 따라 다르겠지만 BooleanBuilder는 다중 조건 처리에 적합하고

그 외의 간단한 쿼리 및 단일 조건에 대해서는 BooleanExpression 이 적합하다고 한다.

 

// booleanExpression
QMember member = new QMember("member");

public List<Member> findAllMember(Integer class, String name) {
    return jpaQueryFactory
            .select(member)
            .from(member)
            .where(nameCheck)
            .where(classCheck)
            .fetch();
}

private BooleanExpression nameCheck(String name) {
    return name != null ? member.name.eq(name) : null;
}

private BooleanExpression classCheck(Integer class) {
    return class != null ? member.class.id.eq(class) : null;
}

 

BooleanExpression 은 메소드 형식으로 보다 명시적인 코드 즉 가독성이 좋아지고

메소드 명을 통해 내용을 보지 않더라도 어떤 기능을 하는지 파악이 가능해진다.

BooleanExpression 에서 null을 반환하면 해당 where 조건이 무시되어 보다 안전하다.

메소드 형식으로 분류되어 BooleanExpression에 and나 or를 이용해 또다른 BooleanExpression 작성이 가능하다

'Spring Boot > Spring Data JPA' 카테고리의 다른 글

queryDsl) subquery limit 1  (0) 2024.01.14
querydsl 에서 case문 사용하기  (0) 2024.01.07
queryDsl 정리 및 예제  (1) 2023.12.03
JPA) JPA Auditing으로 자동화  (0) 2023.12.01
QueryDSL) From 절 SubQuery를 쓰고싶어  (2) 2023.11.23