스터디/JPA

[Querydsl] 2.기본문법 - JPQL vs Querydsl

짐배몬 2020. 10. 23. 00:40

Member 를 조회하는 JPQL 문법과 Querydsl 문법의 차이점을 살펴보고 Querydsl 이 JPQL과 달리 갖고 있는 장점을 알아보자!

기본환경


상세 설정은 하단 Github 링크 참조

Member.class

@Entity
...
public class Member {
...
    private Long id;
    private String username;
    private int age;
    private Team team;
...
}

Team.class

@Entity
...
public class Team {
...
    private Long id;
    private String name;
...
    private List<Member> members = new ArrayList<>();
...
}

차이점


JPQL 조회문

Member findMember = 
        em.createQuery("select m " +
                        "from Member m " +
                        "where m.username = :username", Member.class)
        .setParameter("username", "member1")
        .getSingleResult();

Querydsl 조회문

JPAQueryFactory queryFactory = new JPAQueryFactory(em)

QMember m = new QMember("m");

Member findMember = queryFactory
        .select(m)
        .from(m)
        .where(m.username.eq("member1"))

 

1. QueryFactory와 쿼리타입(Q) 사용

  • Querydsl 을 사용하기 위해서는 QueryFactory 를 생성해 query 문을 작성하여야 한다.

  • Querydsl 에서는 엔티티를 대신해 쿼리타입(Q)을 사용하는데 생성자에는 사용할 별칭을 주면 된다.
    *단건 사용시는 기본적으로 제공해주는 인스턴스를 사용하면 되고 self join 등을 하기 위해서 별칭을 사용한다.

2. Compile 단에서의 오류 검출

  • JPQL 사용시 query 문에 대한 에러는 “논리적 에러” 이다. 즉, Build 나 컴파일 시에는 아무런 문제를 찾을수 없고 사용자가 사용하는 시점인 Runtime 중 에러가 발생한다. 하지만 Querydsl 의 경우 query 문 생성 도중 오타에 대한 물리적 오류가 발생하므로 오류 검출에 있어서 좀더 용의하다.

3. 자동으로 Preparestatment 사용 유도

위의 JPQL 문을 아래와 같이 수정해 보았다.

 

 

member 단건이 아닌 member 전체가 조회되게 된다.

  • 위와 같이 JPQL 에서 잘못된 쿼리 생성시 SQL Injection 에 취약해 질수 있는 반면 Querydsl 에서는 .eq("member1") 와 같은 함수를 이용해 조건(where) 절을 생성하므로 보안에도 좋다고 할수 있다.

https://github.com/JaeHyeonBae/querydsl