QueryDSL은 하이버 네이트 쿼리 언어(HQL:Hibernate Query Language)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다.
QueryDSL은 정적 타입을 이용하여 SQL과 같은 쿼리를 생성할 수 있게 해준다.
Query 빌더로 JPA의 JPQL을 만들어 주는 빌더다.
보통 JPA Repository에서 자동으로 만들어주는 매핑 메소드를 생성하기 어렵거나 복잡한 상황에서 쿼리를 작성하고 데이터를 영속화하게 된다. 이때 사용하는 쿼리가 JPQL이다. 일반 SQL을 사용할 수 있다. 하지만 OOP의 특성을 가져가면서 객체 중심의 DB연결 문제를 해결할 수 있는 JPA는 JPQL이 매우 중요한 요소이다. JPQL은 실제 생성한 엔티티객체를 이용하여 쿼리를 작성하기 때문이다.
QueryDSL은 이런 문제를 해결하기 위해 JPQL을 코드를 이용하여 작성한다. 코딩 과정에서 문법에러를 알 수 있고, 상황에 따라 유동적인 쿼리를 작성할 수 있는 장점이 있다. 개발자 입장에서도 불확실한 String 형태의 쿼리보다 안정적으로 쿼리를 작성할 수 있다.
다음은 JPQL과 QueryDSL을 비교한 것이다.
JPQL
String username = "java"; String jpql = "select m from Member m where m.username = :username"; List<Member> result = em.createQuery(query, Member.class).getResultList();
QueryDSL
String username = "java"; List<Member> result = queryFactory .select(member) .from(member) .where(usernameEq(username)) .fetch();
필자는 JPA를 통해 개발을 하면서 많은 수정 작업을 거치게 되었던 적이 있었다.
그때마다 "이젠 잘못된 곳이 없겠지? -> 오류 -> 수정" 이라는 무한굴레에 빠져 많은 시간을 컴퓨터의열기 속에서 보내게 되었다.
여름이었다..
아무튼 이참에 쓸데없는 시간을 허비하는 것보다 새로운 방법을 찾아 적응하는것이 더 낫겠다는 뒤늦은 생각에 호다닥 찾아보게 되었다.
간단하게나마 정리를 해보았지만, 이 또한 단점이 존재할 거 같아서 무작정 맹신하지는 하지 않으려고 한다.
지금 눈에 보이는 것으로는.. SQL을 안쓰게 될 거 같다는 점..?
해서 적절히 쓰되 남용하지는 말아야겠다.
끝!
출처
https://studio108.tistory.com/26
https://ittrue.tistory.com/292