ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Querydsl로 동적쿼리 쉽게 작성하기
    JPA 2021. 3. 1. 19:48

    JPA를 사용할 때 동적 쿼리를 작성하려면 정말 까다롭고 어렵다.

     

    하지만 Querydsl을 사용하면 쉽고 간편하게 동적 쿼리를 작성할 수 있다. Querydsl의 장점은 자바처럼 SQL문을 작성할 수 있고, 문법 오류가 나면 컴파일 에러로 잡을 수 있기 때문에 정말 좋다. (보통의 SQL문은 런타임에 에러가 발생)

     

    Querydsl로 동적 쿼리를 작성하는 방법은 크게 두 가지가 있다.

    1) Builder 적용

    2) Where절 적용

     

    Builder 적용 

        void dynamicQuery_BooleanBuilder() throws Exception {
            String usernameParam = "member1";
            Integer ageParam = 10;
    
            List<Member> result = searchMember1(usernameParam, ageParam);
            assertThat(result.size()).isEqualTo(1);
        }
    
        private List<Member> searchMember1(String usernameParam, Integer ageParam) {
    
            BooleanBuilder builder = new BooleanBuilder();
            if (usernameParam != null) {
                builder.and(member.username.eq(usernameParam));
            }
    
            if (ageParam != null) {
                builder.and(member.age.eq(ageParam));
            }
    
            return queryFactory
                    .selectFrom(member)
                    .where(builder)
                    .fetch();
        }

    유저 이름과 나이가 파라미터로 넘겨져 왔을 때 동적 쿼리로 조회하는 예제이다.

    BooleanBuilder를 사용하면 and 조건으로 계속해서 묶을 수 있기 때문에 쉽게 동적 쿼리를 구성할 수 있다.

    하지만 SQL문을 봤을 때 한눈에 어떻게 동적 쿼리가 적용되어 있는지 확인하기 쉽지 않다.

     

    Where절 적용

        void dynamicQuery_WhereParam() throws Exception {
            String usernameParam = "member1";
            Integer ageParam = 10;
    
            List<Member> result = searchMember2(usernameParam, ageParam);
            assertThat(result.size()).isEqualTo(1);
        }
    
        private List<Member> searchMember2(String usernameParam, Integer ageParam) {
            return queryFactory
                    .selectFrom(member)
                    .where(usernameEq(usernameParam), ageEq(ageParam))
                    .fetch();
        }
    
        private BooleanExpression usernameEq(String usernameParam) {
            return usernameParam != null ? member.username.eq(usernameParam) : null;
        }
    
        private BooleanExpression ageEq(Integer ageParam) {
            return ageParam != null ? member.age.eq(ageParam) : null;
        }

    실제로는 두 번째 방법이 많이 사용된다. 이 예제 또한 유저 이름과 나이가 파라미터 조건으로 넘어오게 되는데, 첫 번째 방법과 다르게 SQL문을 보고 동적 쿼리가 어떻게 적용되었는지 파악하기 쉽다.

     

    이렇게 동적 쿼리를 작성하는 두 가지 방법을 알아보았는데 실제로 Querydsl을 사용하면 동적쿼리를 정말 쉽게 작성할 수 있으므로 꼭 한번 사용해보자!

    'JPA' 카테고리의 다른 글

    벌크 연산  (0) 2021.02.28
    페치 조인(fetch join)  (0) 2021.02.23
    OSIV (Open Session In View)  (0) 2021.02.22

    댓글

Designed by Tistory.