728x90
들어가기 앞서..
앞서 스터디를 진행하며, @Query를 사용하여 Repository에서 쿼리를 작성해주었다. 하지만, @Query를 사용하게 된다면 SQL을 문자열 형태로 작성해주어야한다. 이렇게 되면 구문 오류를 찾기도 어려울 뿐더러 쿼리를 작성해줄 때 불편함이 존재한다. 또한 오류를 컴파일 시점이 아닌, 어플리케이션 구동시점에 발견할 수 있다.
그렇기에 위의 문제들을 해결해줄 수 있는 QueryDSL을 공부하고 적용하기로 했다. QueryDSL의 큰 장점은 Java 코드로 SQL 문을 작성할 수 있기에 컴파일 시점에 오류를 찾을 수 있다.
QueryDSL 이란?
간단하게 설명하자면 다음과 같다.
쿼리를 자바코드로 작성할 수 있게 도와주는 기술이고, Spring Data JPA로 해결하지 못하는 복잡한 쿼리/동적 쿼리를 해결할 수 있다. 또한 자바코드로 작성하기 때문에 문법오류를 컴파일 시점에 잡아낼 수 있다.
QueryDSL을 사용하게 된다면, 컴파일 단계에서 자동으로 작성된 Entity를 기반으로 QClass를 생성해준다. QueryDSL은 쿼리를 작성할 때 해당 QClass를 기반으로 쿼리를 실행하게 된다. 해당 QClass 파일들은 컴파일마다 변경사항을 적용해서 새로 생성되기에, git 코드로 올리지 않는것이 좋다.
QueryDSL을 사용하는 이유는 무엇일까?
위에서도 설명했지만 QueryDSL을 사용하는 이유는 크게 2가지가 있다.
- QueryDSL은 앞서 다른 쿼리들과 다르게 문자열로 작성해주는 것이 아닌, Java 코드로 작성하기에 오탈자가 생길 일이 적어지고, 객체지향적으로 개발이 가능하다.
- 애플리케이션 구동시점에 오류를 알 수 있는 것이 아닌, 컴파일 시점에 오류를 알 수 있기에 빠르게 오류 확인과 수정이 가능하다.
@Query, JPQL, QueryDSL 비교
@Query("select p " +
"from Pet p " +
"where p.owner.id=:ownerId")
List<Pet> findPetsByOwnerId(Long ownerId);
Long ownerId = 2;
String jpql = "select p from Pet p where p.owner.id=:ownerId";
List<Pet> result = em.createQuery(jpql, Pet.class).getResultList();
Long ownerId = 2;
List<Pet> result = queryFactory
.select(pet)
.from(pet)
.where(ownerIdEq(ownerId))
.fetch();
728x90