Query DSL : 동적 쿼리 작성

    이 글은 인프런의 김영한님의 강의를 듣고 복습하며 작성한 글입니다.

     


    동적 쿼리 작성

    JPA를 이용해서 동적 쿼리를 작성하게 될 경우, String으로만 컴파일이 되기 때문에 동적 쿼리를 작성하는 것이 꽤 까다롭다. QUERY DSL은 JPA의 동적 쿼리 작성 부분을 용이하도록 두 가지 방법을 지원한다.

    아래 두 방법을 사용하기 전에 숙지해야하는 것은 QUERY DSL에서 Where, On절에 'null'값이 들어가게 되면 Query DSL은 해당 값이 없는 것으로 인식을 한다는 것이다. 이 성질을 활용해 동적 쿼리를 작성하기 때문에 반드시 유의해야한다. 

     


    동적 쿼리 작성, BooleanBuilder 활용

    BooleanBuilder를 만들고, Builder에 대한 동적 쿼리 처리를 해준다. 처리가 완료된 BooleanBuilder를 where절, on절에 넣어주어 필터링 하는 용도로 사용할 수 있다. 

    private List<Member> searchMember1(String usernameCond, Integer ageCond) {
    
    	// BooleanBuilder를 하나 생성한다. 
        BooleanBuilder builder = new BooleanBuilder();
        
        // BooleanBuilder는 and, or문으로 조립가능.
        if (usernameCond != null) {
            builder.and(member.username.eq(usernameCond)); 
        }
    
        if (ageCond != null) {
            builder.and(member.age.eq(ageCond));
        }
    
    
    	// builder 결과를 where 절에 넣어줌
        // builder끼리도 and로 조립 가능.
        return queryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }
    1. new BooleanBuilder()로 BooleanBuilder를 생성한다.
      • BooleanBuilder를 생성할 때, 초기값을 넣을 수 있음
      • new BooleanBuilder(member.username.eq(usernameConde))
    2. 각 인자가 null인지 확인한 후, 필요한 Builder에 and, or 등으로 쿼리를 조립해준다. 
    3. 완성된 Builder는 where, on절에 삽입한다. 
      • Builder끼리 and, or로 조립도 가능하다. 

     


    동적 쿼리 작성, BooleanExpression 활용

    BooleanBuilder와 마찬가지로, BooleanExpression을 활용해서 동적으로 쿼리를 조립해서 사용할 수 있다.

       private List<Member> searchMember2(String usernameCond, Integer ageCond) {
    
            /**
             * where 문에 null이 들어오면, QueryDSL은 null을 무시함.
             * where 문에 ,로 나열되면 and로 들어감.
             */
    
            return queryFactory
                    .selectFrom(member)
                    .where(usernameEq(usernameCond), ageEq(ageCond)) 
                    .fetch();
        }
    
        private BooleanExpression usernameEq(String usernameCond) {
            // null 처리를 해준다.
            return usernameCond != null ? member.username.eq(usernameCond) : null;
        }
    
        private BooleanExpression ageEq(Integer ageCond) {
            // null 처리를 해준다.
            return ageCond != null ? member.age.eq(ageCond) : null; 
        }
    
        private BooleanExpression allEq(String usernameCond, Integer ageCond) {
            // null인 경우, 조립 시 무시한다
            return usernameEq(usernameCond).and(ageEq(ageCond));
        }
    1. BooleanExpression 타입으로 메서드를 작성한다. 
    2. BooleanExpression 타입은 and, or 등을 사용해서 조립도 할 수 있다.
      • 조립할 때, null값이 들어오면 해당 쿼리문은 무시한다. 
    3. BooleanExpression의 결과값 끼리도 조립해서 메서드를 작성할 수 있다. 

    'Spring > Query DSL' 카테고리의 다른 글

    Query DSL : Spring 사용 위한 셋팅  (0) 2022.01.22

    댓글

    Designed by JB FACTORY