개발자의 오르막

[QueryDsl #02] QueryDsl 의 기본개념 본문

ORM/JPA

[QueryDsl #02] QueryDsl 의 기본개념

계단 2020. 11. 16. 18:34

# 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 문장을 자바로 전환하기 때문에 이식성이 높다.

 

 

Comments