인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

궁금이님의 프로필 이미지
궁금이

작성한 질문수

실전! Querydsl

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

allEq() 만들기

해결된 질문

작성

·

331

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
allEq를 만들기 위해서,

    private BooleanExpression allEq(MemberSearchCondition condition){
        return usernameEq(condition.getUsername())
                .and(teamNameEq(condition.getTeamName()))
                .and(ageGoe(condition.getAgeGoe()))
                .and(ageLoe(condition.getAgeLoe()));
    }

이런 식의 코드를 만들기 위해서는 null 대신 빈 표현식을 반환해야 하는데, new BooleanExpression()은 안되는 모양이예요.

그래서 찾아봤더니,
null 대신 Expressions.TRUE를 중립조건으로 반환하게 하는거예요.

근데 이러면 나가는 쿼리가,

    /* select
        member1.id,
        member1.username,
        member1.age,
        team.id,
        team.name 
    from
        Member member1   
    left join
        member1.team as team 
    where
        true 
        and team.name = ?1 
        and true 
        and true */ select
            m1_0.member_id,
            m1_0.username,
            m1_0.age,
            m1_0.team_id,
            t1_0.name 
        from
            member m1_0 
        left join
            team t1_0 
                on t1_0.team_id=m1_0.team_id 
        where
            true 
            and t1_0.name=? 
            and true 
            and true

이렇게 true로 섞여서 나가지만, 저런 것들은 DB내에서 최적화 해줘서 문제가 없다고 해요.

 

근데 아무래도 익숙하지 않은 상황에서는 다른 분이 보았을 때 저게 뭐지? 왜 저 쿼리가 나가지? 라는 생각을 할 것 같아요.

그런데, 저 and true를 보고 아, 동적 쿼리를 사용했나? 라고 생각할 수 있는 사람끼리 본다면 굉장히 괜찮은 방법 같아요.

 

근데 여튼간에 보여지는 것 자체에는 의미없는 쿼리가 나가는 거라서, 유지보수 면에서 좀 그럴 것 같다는 생각이 들어서요.

실무에서는 어떤가요?

답변 1

1

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

안녕하세요. 궁금이님

이렇게 하는 것은 좋은 방향이 아니라 생각합니다.

다음을 참고해주세요.

https://www.inflearn.com/questions/94056

감사합니다.

궁금이님의 프로필 이미지
궁금이
질문자

감사합니다!

궁금이님의 프로필 이미지
궁금이

작성한 질문수

질문하기