JPQL
JPQL은 지금까지 제가 사용한 형식입니다. 쿼리를 짜서 직접 실행하는 스타일입니다.
@Test
public void startJPQL() throws Exception {
//member1을 찾아라.
String qlString =
"select m from Member m " +
"where m.username = :username";
// when
Member findMember = em.createQuery(qlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
//then
assertThat(findMember.getUsername()).isEqualTo("member1");
}
이렇게 jpql로 쿼리를 짠 뒤 파라미터 바인딩 처리를 해서 원하는 값을 가져올 수 있습니다.
단점은 실행 시점에 오류를 발견할 수 있다는 것입니다. 예를 들어 setParameter에 이름을 잘 못 넣어도 오류가 나지 않고 실행 후에 오류를 알 수 있습니다.
Querydsl
@Test
public void startQuerydsl() throws Exception {
// given
QMember m = new QMember("m");
// when
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1")) //파라미터 바인딩 처리
.fetchOne();
//then
assertThat(findMember.getUsername()).isEqualTo("member1");
}
Querydsl은 이렇게 자바 형식으로 쿼리를 짤 수 있습니다. 그래서 JPQL과 다르게 에러를 바로 발견할 수 있습니다.
또, 파라미터 바인딩 또한 m.username.eq()처럼 where문에서 바로 처리할 수 있습니다!!
쿼리도 생각한 데로 나갑니다!!
JPQL vs Querydsl
- 문법과 표현력
- JPQL: JPQL은 SQL과 유사한 문법을 가지며, 엔티티와 그 관계를 기반으로 쿼리를 작성합니다. 객체 지향적인 방식으로 쿼리를 작성할 수 있으나, 복잡한 동적 쿼리 작성이나 쿼리의 가독성 부분에서 제한적일 수 있습니다.
- Querydsl: Querydsl은 자바 코드에 DSL(Domain Specific Language)을 사용하여 쿼리를 작성합니다. 이로 인해 쿼리 작성에 높은 유연성과 표현력을 제공하며, 복잡한 동적 쿼리를 작성하기가 더 간편합니다.
- 타입 안정성
- JPQL: JPQL은 문자열 기반 쿼리 언어로, 쿼리 작성 시 컴파일 시점에서의 타입 안전성이 보장되지 않습니다. 오타나 잘못된 쿼리 작성으로 인한 오류가 런타임에 발생할 수 있습니다.
- Querydsl: Querydsl은 자바 코드를 기반으로 쿼리를 작성하므로 컴파일 시점에서 타입 안전성이 보장됩니다. 쿼리 작성 시 오타나 잘못된 사용으로 인한 오류를 사전에 방지할 수 있습니다.
- 동적 쿼리 작성
- JPQL: JPQL에서 동적 쿼리를 작성하려면 문자열 연결과 조건문을 활용해야 하므로 복잡하고 가독성이 떨어질 수 있습니다.
- Querydsl: Querydsl은 동적 쿼리 작성을 간단하게 할 수 있도록 지원합니다. 자바 코드로 조건을 생성하고 조합하여 쿼리를 작성하는데 유용합니다.
- IDE 지원
- JPQL: JPQL은 문자열 기반으로 쿼리를 작성하기 때문에 IDE(Integrated Development Environment)에서 쿼리 문법 하이라이팅이나 자동 완성을 제공하기 어렵습니다.
- Querydsl: Querydsl은 자바 코드를 사용하기 때문에 IDE에서 코드 완성과 문법 하이라이팅을 지원해주어 쿼리 작성 시 실수를 줄일 수 있습니다.
출처
https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84/dashboard
'Spring JPA 공부 > Querydsl' 카테고리의 다른 글
Querydsl 기본 문법 (정렬, 페이징, 집합) (1) | 2023.08.28 |
---|---|
Querydsl 기본 문법 (검색, 결과) (0) | 2023.08.28 |
Querydsl 세팅 (0) | 2023.08.27 |