Querydsl은 오픈 소스 프로젝트이고 type-safe한 쿼리를 위한 Domain Specific Language이다.
SQL query는 문자이다. 이는 type-check가 불가능하고 실행해 보기 전까지 작동여부 확인이 어렵다. 만약 SQL이 class처럼 Type이 있고, Java코드로 작성할 수 있다면 좋지 않을까? SQL을 java로 type-safe하게 개발 할 수 있게 해주는 프레임워크가 Querydsl이다. QueryDSL은 JPQL(HQL)을 type-safe하게 작성하기 위해서 만들어졌고 다음처럼 동작한다.
Querydsl -> JPQL -> SQL
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.1.4</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.1.4</version>
<scope>provided</scope>
</dependency>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
위의 설정은 엔티티를 기반으로 prefix 'Q'가 붙는 클래스들을 자동 생성한다. 즉, Member라는 엔티티 클래스가 있다고 하면 Querydsl에서 QMember라는 클래스를 생성한다. apt-maven-plugin 은 APT와 통합되어져 있기 때문에 엔티티에 존재하는 애노테이션을 기반으로 'Q'가 붙는 새로운 코드와 파일을 만들어 주는 것이다.
Annotation Processing Tool 의 약자로 JDK 1.6 부터 도입되었다. APT은 Annotation 이 있는 기존코드를 바탕으로 새로운 코드와 새로운 파일들을 만들 수 있고, 이들을 이용한 클래스에서 compile 하는 기능도 지원해준다. APT를 이용해서 새롭게 생성되어진 QDslMember은 다음과 같은 구조로 생성되어진다. 만약 원본이 되는 DslMember 클래스의 특정 필드가 변경이 되거나 추가된다면 mvn package 를 재실행 해야 한다.
querydsl을 이용해 쿼리를 작성하기 위해서는 QueryDslRepositorySupport 상속받아야 하며
super(DslMember.class); 처럼 도메인 엔티티 클래스를 슈퍼 타입인 QueryDslRepositorySupport 생성자의 아규먼트로 넘겨줘야 한다.