스터디/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) 절을 생성하므로 보안에도 좋다고 할수 있다.