-
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