JPQL vs Querydsl
두가지를 비교하기 위한 테스트 코드이다
참고로 봐주면 좋을 것 같고, 강의는 인프런에서 들으면 된다 !
✅ assertThat() 사용법
강의를 따라 코드를 작성하다보면 assertThat()을 사용하시길래 따라하려고 했더니 다음과 같이 빨간 줄이 뜨면서 사용이 되지 않는 것을 발견했다.
그래서 같은 오류가 생길까봐 해결 방법을 공유하려고 한다.
✅ assertThat() 해결 방법
import static org.assertj.core.api.Assertions.assertThat;
위 한 줄만 추가해주면 된다 !
이 구문은 Assertions 클래스의 특정 메서드인 assertThat을 정적(static)으로 가져오는 구문으로,
코드를 작성할 때 클래스명을 생략하고 assertThat을 바로 사용할 수 있다는 특징이 있다.
반응형
✅ JPQL vs Querydsl
package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;
import study.querydsl.entity.QMember;
import study.querydsl.entity.Team;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
@PersistenceContext
EntityManager em;
@BeforeEach
public void before() {
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
}
@Test
public void startJPQL(){
// member1을 찾아라
Member findMember = em.createQuery("select m from Member m where m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
@Test
public void startQuerydsl(){
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
}
1. JPQL (Java Persistence Query Language)
JPQL은 JPA에서 지원하는 쿼리 언어로, SQL과 비슷하지만 Entity 객체를 대상으로 쿼리를 작성합니다.
- 특징:
- 문자 기반 쿼리 작성:
- JPQL은 쿼리를 문자열(String) 형태로 작성해야 합니다.
- 실행 시점까지 쿼리에 대한 오류를 확인할 수 없습니다.
- 파라미터 바인딩 직접 처리:
- 쿼리의 파라미터를 개발자가 수동으로 처리해야 합니다.
- 코드가 복잡해지고 실수 가능성이 높습니다.
- 표준 API:
- JPA 스펙에 포함된 표준 기능으로, JPA 구현체(Hibernate, EclipseLink 등)에서 기본 지원합니다.
- 문자 기반 쿼리 작성:
- 한계:
- 문자열로 작성되기 때문에 문법 오류가 있어도 실행 시점에야 발견됩니다.
- 파라미터 바인딩을 수동으로 처리해야 해서 코드가 길고 복잡해질 수 있습니다.
2. QueryDSL
QueryDSL은 JPA와 함께 사용되는 타입 세이프 쿼리 빌더로, 동적 쿼리 작성과 유지보수를 편리하게 만듭니다.
- 특징:
- 코드 기반 쿼리 작성:
- 쿼리를 메서드 체인과 코드로 작성합니다.
- 컴파일 시점에 문법 오류를 확인할 수 있어 안전합니다.
- 자동 파라미터 바인딩:
- 파라미터를 자동으로 바인딩해 주므로 코드가 간결하고 실수가 줄어듭니다.
- 가독성과 유지보수성:
- 객체 지향적인 쿼리 작성 방식으로, 복잡한 동적 쿼리를 쉽게 구현할 수 있습니다.
- 코드 기반 쿼리 작성:
- 장점:
- 컴파일 시점 오류 검출: 쿼리가 잘못되면 컴파일 시점에 경고가 발생하므로 실행 시점 오류를 방지합니다.
- 간결한 동적 쿼리 작성: 동적 조건을 쉽게 추가할 수 있습니다.
- 직관적 문법: 코드만 보고도 쿼리의 의도를 이해하기 쉽습니다.
728x90
항목 | JPQL | QueryDSL |
쿼리 작성 방식 | 문자열 기반(String) | 코드 기반(메서드 체인) |
오류 발견 시점 | 실행 시점 | 컴파일 시점 |
파라미터 바인딩 | 직접 처리 | 자동 처리 |
동적 쿼리 작성 | 복잡하고 비효율적 | 간결하고 효율적 |
유지보수성 | 문자열 수정 필요, 실수 가능성 높음 | 타입 세이프, 유지보수 쉬움 |
표준 지원 여부 | JPA 표준 | JPA 확장 라이브러리 |
적용 가능성 | 간단한 쿼리에 적합 | 복잡한 동적 쿼리에 적합 |
728x90
반응형
'QueryDSL' 카테고리의 다른 글
[JPA 활용] QueryDSL 기본 Q-Type 활용 방법 (2) | 2024.11.18 |
---|---|
[JPA 활용] QueryDSL 환경설정 - java: Attempt to recreate a file for type 오류, 에러 해결 (2) | 2024.11.16 |
[JPA 활용] QueryDSL (4) | 2024.11.14 |