객체 생성 시점에 생성자에 파라미터를 던지는 방식으로 기본 값을 지정할 수 있음
where절에 생성된 객체를 넣어주면 끝
where절에 null을 넣게되면 그냥 무시가 됨
where절에 들어가는 값으로 method를 던져 줌
다이나믹 쿼리를 위해 생성한 method들을 재활용할 수도 있음
다중 조건을 골라서 조립할 수도 있음
(메소드별로 명확한 명칭을 주면 쿼리 가독성도 높아짐)
중요 !
null 체크는 반드시 해야한다.
    @Test
    public void dynamicQuery() {
        String usernameParam = "member1";
        Integer ageParam = 10;
        // BooleanBuilder 사용
        List<Member> resultA = searchMemberWithBooleanBuilder(usernameParam, ageParam);
        // where절 다중 파라미터
        List<MemberDto> resultB = searchMemberWithMultiWhere(usernameParam, ageParam);
        assertThat(resultA.size()).isEqualTo(1);
        assertThat(resultB.size()).isEqualTo(1);
    }
    private List<Member> searchMemberWithBooleanBuilder(String usernameCond, Integer ageCond) {
        // 초기값 지정 가능
        // BooleanBuilder builder = new BooleanBuilder(member.username.eq(usernameCond));
        BooleanBuilder builder = new BooleanBuilder();
        if(usernameCond != null) {
            builder.and(member.username.eq(usernameCond));
        }
        if(ageCond != null) {
            builder.and(member.age.eq(ageCond));
        }
        return jpaQueryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }
    private List<MemberDto> searchMemberWithMultiWhere(String usernameCond , Integer ageCond) {
        return jpaQueryFactory
                .select(new QMemberDto(member.username, member.age))
                .from(member)
                .where(usernameEq(usernameCond), ageEq(ageCond))
                //.where(allEq(usernameCond, ageCond))
                .fetch();
    }
    private BooleanExpression usernameEq(String usernameCond) {
        return usernameCond == null ? null : member.username.eq(usernameCond);
    }
    private BooleanExpression ageEq(Integer ageCond) {
        return ageCond == null ? null : member.age.eq(ageCond);
    }
    private BooleanExpression allEq(String usernameCond, Integer ageCond) {
        return usernameEq(usernameCond).and(ageEq(ageCond));
    }
