Querydsl was born out of the need to maintain HQL queries in a typesafe way. Incremental construction of HQL queries requires String concatenation and results in hard to read code. (출처-공식문서)
HQL for Hibernate was the first target language for Querydsl, but nowadays it supports JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections and RDFBean as backends. (출처-공식문서)
Type safety is the core principle of Querydsl. Queries are constructed based on generated query types that reflect the properties of your domain types. Also function/method invocations are constructed in a fully type-safe manner. (출처-공식문서)
JPA에서 지원하는 다양한 쿼리 방법 중 가장 단순한 조회 방법으로, SQL의 경우에는 DB 테이블을 대상으로 쿼리를 질의하지만, 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();
JPAAnnotationProcessor
가 컴파일 시점에 작동해서 @Entity
등의 특정 어노테이션을 찾아 해당 파일들을 분석해서 QClass를 만든다.APT(Annotation Processor Tool)
- 어노테이션이 있는 기존 코드를 바탕으로 새로운 코드와 새로운 파일들을 만들 수 있고, 이들을 이용한 클래스에서 컴파일하는 기능을 지원한다.
- 쉬운 예시로 Lombok의
@Getter
나@Setter
가 있다.
- APT가 컴파일 시점에 해당 어노테이션 기준으로 getter와 setter를 만들어주는 것 처럼.
정리해보면..🤔
참고