본문 바로가기

스프링

[Query DSL] Query DSL 왜 쓸까?

Query DSL을 배우기 전, '왜 쓸까?'에 대해 정리

   

JPA에서 JPQL을 작성할 때 많은 불편함이 있었다.

em.createQuery(
	"select new Project.repository.itemQueryDto(i.id, x.name, ..)" +
    " from Item i" +
    " join i.xx x" +
    ...
, ItemQueryDto.class)
  1. 컴파일 단계에서 에러를 못 찾음
    • 위 처럼, 문자열을 하나하나 이어 만들어 쿼리문을 짜야하기 때문에 잘못 작성할 경우, 컴파일러 단계에서 에러를 발견할 수 없다.
  2. 가독성이 안좋다.
    • 한눈에 보기에도 코드가 잘 안읽힌다. (위 예시는 짧지만, 쿼리문이 더 길어질 경우 정말 보기 힘들다.)
    • 특히, 저 "new Project...()"와 같은 부분이 많이 거슬린다.
  3. 동적 쿼리를 짜기 힘들다. 

 

이러한 단점들을 없앤 것이 QueryDSL이다.

간단히 QueryDSL의 장점/특징을 요약하면 아래와 같다.

  1. 유지보수성이 향상. (쿼리문을 문자열이 아닌 코드화)
  2. 유연성이 향상된다. (동적 쿼리를 작성하기 편리해진다.)
  3. 컴파일 시점에 에러 발견 가능!

위 예시 코드를 QueryDSL로 작성하면 아래와 같이 바뀐다!   

...

query.select(itemQueryDto)
	.from(item)
	.join(item.xx)
	.fetch();

...

한 눈에 보기에도 깔끔하다.