인프런 커뮤니티 질문&답변

우럭아왜우럭님의 프로필 이미지

작성한 질문수

실전! Querydsl

동적 쿼리와 성능 최적화 조회 - Where절 파라미터 사용

동적쿼리 BooleanBuilder 질문

21.01.26 10:14 작성

·

425

0

안녕하세요 강사님, 강의 잘 보고 있습니다.

해당 강의 다른영상에서의 질문에서 BooleanBuilder와 자바 8을 이용해서 체이닝이 가능한 코드를 봣었습니다.

영상강의처럼  BooleanExpression을 사용한 ageBetween은 null이 반환될 수 있어서 테스트시 age를 안 넣으면 NPE가 뜨더라구요. 그래서 아래처럼 BooleanBuilder 사용한 코드로 바꾸면 null에 무조건 안전하게 되는게 맞는건가요?

public List<MemberTeamDto> search(MemberSearchCondition condition) {
return queryFactory
.select(new QMemberTeamDto(
member.id.as("memberId"),
member.username,
member.age,
team.id.as("teamId"),
team.name.as("teamName")))
.from(member)
.leftJoin(member.team, team)
.where(
usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageBetween(condition.getAgeLoe(), condition.getAgeGoe()))
.fetch();
}

private BooleanBuilder usernameEq(String username) {
return nullSafeBuilder(() -> member.username.eq(username));
}

private BooleanBuilder teamNameEq(String teamName) {
return nullSafeBuilder(() -> team.name.eq(teamName));
}

private BooleanBuilder ageGoe(Integer ageGoe) {
return nullSafeBuilder(() -> member.age.goe(ageGoe));
}

private BooleanBuilder ageLoe(Integer ageLoe) {
return nullSafeBuilder(() -> member.age.loe(ageLoe));
}

private BooleanBuilder nullSafeBuilder(Supplier<BooleanExpression> f) {
try {
return new BooleanBuilder(f.get());
} catch (Exception e) {
return new BooleanBuilder();
}
}

private BooleanBuilder ageBetween(Integer ageLoe, Integer ageGoe) {
return ageLoe(ageLoe).and(ageGoe(ageGoe));
}

익셉션마다 BooleanBuilder 객체를 새로 만드는데, 객체를 생성할 때 드는 비용은 null을 위해서는 크게 상관이 없는거죠?

그리고, ageBetween 부분에서 강의는 파라미터를 int 타입으로 받는데, 테스트시 NPE가 나와서 Integer로 바꾸니 되더라구요. 이유가 원래 Integer타입을 int로 자동 언박싱하는 중에 null을 int에 넣지 못해서 NPE가 뜨는건가요?

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

2021. 01. 26. 22:58

안녕하세요. seungbin님^^

영상강의처럼  BooleanExpression을 사용한 ageBetween은 null이 반환될 수 있어서 테스트시 age를 안 넣으면 NPE가 뜨더라구요. 그래서 아래처럼 BooleanBuilder 사용한 코드로 바꾸면 null에 무조건 안전하게 되는게 맞는건가요?

-> 이 부분은 제가 답을 드리는 것도 좋지만, 직접 코드로 간단하게 테스트를 해보시는 것을 추천드립니다. 그래야 진짜 본인 것이 되니까요.

익셉션마다 BooleanBuilder 객체를 새로 만드는데, 객체를 생성할 때 드는 비용은 null을 위해서는 크게 상관이 없는거죠?

-> 네 사실 이런 비용은 거의 0에 가깝습니다^^

그리고, ageBetween 부분에서 강의는 파라미터를 int 타입으로 받는데, 테스트시 NPE가 나와서 Integer로 바꾸니 되더라구요. 이유가 원래 Integer타입을 int로 자동 언박싱하는 중에 null을 int에 넣지 못해서 NPE가 뜨는건가요?

-> null은 int에 넣을 수 없습니다. 대신 Integer는 null을 받을 수 있습니다.

감사합니다^^

1

우럭아왜우럭님의 프로필 이미지

2021. 01. 26. 23:09

감사합니다~