본문 바로가기
[IT]/Querydsl

[QueryDSL] JPQL vs Query DSL

by dop 2021. 3. 26.

SQL과 오타

Mybatis, JDBC Template, JPQL 은 모두 쿼리문을 String 형식으로 직접 작성해서 구현하게 된다. 심지어 Spring Data JPA도 때때로 NativeQuery로 작성해야 한다. 백엔드 개발 경험이 한 번이라도 있다면, 쿼리를 작성하다가 오타가 난 경험이 있을 것이다. String으로 이뤄져 있기에 컴파일 단계에서 디버깅이 불가능하다. 그 말은 에러가 발생해도 띄어쓰기를 잘못 한 건지 대소문자를 잘못 쓴건지 알 수가 없다는 말이다. 

 

QueryDSL은 자바코드로 쿼리를 만들기 때문에 컴파일 시점에서 오류를 잡을 수 있고, 메서드 형식으로 작성하기 때문에 IDE 코드 어시스턴트의 도움도 받을 수 있다. 특히 현업에서 여러 번의 Join과 동적쿼리를 작성할 때, 그 진가를 보여준다고 한다.

JPQL vs Query DSL

Select * From Member where id = 1L;

  @Test
  @Transactional
  public void JPQL() {
 	 Member findMember = em.createQuery("select m from Member m where m.id = :id",Member.class)
  		  .setParameter("id",userId).getSingleResult();
  }
@Test
@Transactional
public void DSL() throws Exception {
        JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(em);
        QMember m = new QMember("m"); //식별자
        
        Member findMember = jpaQueryFactory
                .select(m)
                .from(m)
                .where(m.id.eq(1L))
                .fetchOne();
}

그렇다, QueryDSL이 더 길다. 하지만 다 아시다시피 라인 수가 중요한게 아니다. 한 눈에 들어오고 들여쓰기 덕분에 너무 편안하게 읽힌다. 앞서 언급한 컴파일 시점 오류 파악, 파라미터 바인딩까지 쿼리 길이가 길어질수록 차이가 커진다.

 

이상으로 JPQL vs Query DSL 포스팅을 마치겠습니다.

728x90