중급 문법 - Part2


동적쿼리


BooleanBuilder 사용

BooleanBuilder 클래스를 사용하는 방식이다.


@Test
@DisplayName("동적쿼리 : BooleanBuilder")
public void test1() {

    String usernameParam = "member1";
    Integer ageParam = 10;

    List<Member> resulst = searchMember1(usernameParam, ageParam);

}

조건이 null이 아닐 때만 and 조건이 붙는다.

private List<Member> searchMember1(String usernameCond, Integer ageCond) {

        BooleanBuilder builder = new BooleanBuilder();

        if (usernameCond != null) {
            builder.and(member.username.eq(usernameCond));
        }

        if (ageCond != null) {
            builder.and(member.age.eq(ageCond));
        }

        return queryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }


Where 다중 파라미터 사용

BooleanBuilder 클래스를 사용하는 방식보다 깔끔하게 작성할 수 있어

가독성이 좋아지고, 다양한 조건들을 조립할 수 있다는 큰 장점이 있다.


성인 남성만 선택해야 한다. 와 같이 복합적인 조건이 들어가는 경우를

코드로 작성해 보겠다.


우선 성인이면 20살 이상이고, 성별은 남성(M)일 것이다.

▷ 성별(남) 여부확인

private BooleanExpression genderEq(String genderCond) {
    return genderCond != null ? member.gender.eq(genderCond) : null;
}


▷ 나이 20살 이상 여부확인

private BooleanExpression ageGoe(Integer ageCond) {
    return ageCond != null ? member.age.goe(ageCond) : null;
}


▷ 전체 코드 확인

private List<Member> maleAdultList(String genderCond, Integer ageCond) {
    return queryFactory
                .selectFrom(member)
                .where(
                        genderEq(genderCond),
                        ageGoe(ageCond)
                )
                .fetch();
}


그런데 성인 남성의 경우에는 어떤 경우에도 20살 이상 + 남성 이므로

아래의 코드 처럼 다시 작성해서 가독성과 재사용성을 증가시킬 수 있다.

private List<Member> maleAdultList(String genderCond, Integer ageCond) {
    return queryFactory
                .selectFrom(member)
                .where(isAdultMale(genderCond,ageCond))
                .fetch();
}
private BooleanExpression isAdultMale(String genderCond, Integer ageCond) {
    return genderEq(genderCond).and(ageGoe(ageCond));
}

이 경우에도 null 처리를 주의해야 한다.

고정적으로 들어가야 하는 값이면 이렇게 넣어줘도 될 것 같다는 생각이다.

genderCond = "M"
ageCond = 20;