개발자의 오르막
[QueryDsl #02] QueryDsl 의 기본개념 본문
# JPQL 과 QueryDsl 의 차이
@SpringBootTest
@Transactional
public class QueryDslBasicTest {
@PersistenceContext
EntityManager em;
JPAQueryFactory queryFactory;
@BeforeEach
public void before() {
queryFactory = new JPAQueryFactory(em);
PocketMonMaster masterA = new PocketMonMaster("masterA");
PocketMonMaster masterB = new PocketMonMaster("masterB");
em.persist(masterA);
em.persist(masterB);
PocketMon pocketMon1 = new PocketMon("pocketmon1", 23, masterA);
PocketMon pocketMon2 = new PocketMon("pocketmon2", 12, masterA);
PocketMon pocketMon3 = new PocketMon("pocketmon3", 11, masterB);
PocketMon pocketMon4 = new PocketMon("pocketmon4", 5, masterB);
em.persist(pocketMon1);
em.persist(pocketMon2);
em.persist(pocketMon3);
em.persist(pocketMon4);
}
@Test
public void startJPQL() {
String qlString =
"select p from PocketMon p where p.name = :name";
PocketMon findPocketMon = em.createQuery(qlString, PocketMon.class)
.setParameter("name", "pocketmon1")
.getSingleResult();
assertThat(findPocketMon.getName()).isEqualTo("pocketmon1");
}
@Test
public void startQueryDsl() {
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QPocketMon p = new QPocketMon("p");
PocketMon findPocketMon = queryFactory
.select(p)
.from(p)
.where(p.name.eq("pocketmon1"))
.fetchOne();
assertThat(findPocketMon.getName()).isEqualTo("pocketmon1");
}
}
- JPA 를 사용하는 것에 있어 가장 큰 장점은 SQL 문장을 자바로 사용할 수 있다는 점이다.
그러나 JPQL 은 sql 문장자체를 JPQL 문법으로 사용해야 해서 오타의 위험이 있고, 잘못된 로직은
어플리케이션을 실행했을 때 알 수있는 단점이 있다.
JPQL 은 또다른 SQL 문법을 익히는 느낌을 받게된다.
- Criteria 는 자바로 SQL 문장을 사용할 수 있지만 그 방법이 복잡하다.
- QueryDsl 은 컴파일 단계에서 오타 부분을 잡아줄 수 있으며, sql 문장을 자바로 전환하기 때문에 이식성이 높다.
'ORM > JPA' 카테고리의 다른 글
[QueryDsl #1] 프로젝트 환경설정 (0) | 2020.10.25 |
---|---|
[# JPA] Pageable (0) | 2020.06.06 |
SpringBoot + JPA QueryDSL 연동 (0) | 2019.10.08 |
Spring Security + JPA 로그인 구현 (String 아이디로 로그인 하기) (0) | 2019.09.26 |
Spring Security Login 기능 구현 (0) | 2019.09.24 |
Comments