JPA - Querydsl란?

Yuri Lee·2020년 12월 9일
0

Querydsl란?

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

Querydsl 버전에 따른 차이

  • 4.0.1 버전까지는 list 조회 시 .list() 메서드를 사용
  • 4.0.2 버전부터는 fetch() 메서드로 이름이 변경됨

메이븐 pom.xml 설정

<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'가 붙는 새로운 코드와 파일을 만들어 주는 것이다.

APT란?

Annotation Processing Tool 의 약자로 JDK 1.6 부터 도입되었다. APT은 Annotation 이 있는 기존코드를 바탕으로 새로운 코드와 새로운 파일들을 만들 수 있고, 이들을 이용한 클래스에서 compile 하는 기능도 지원해준다. APT를 이용해서 새롭게 생성되어진 QDslMember은 다음과 같은 구조로 생성되어진다. 만약 원본이 되는 DslMember 클래스의 특정 필드가 변경이 되거나 추가된다면 mvn package 를 재실행 해야 한다.

사용방법

querydsl을 이용해 쿼리를 작성하기 위해서는 QueryDslRepositorySupport 상속받아야 하며
super(DslMember.class); 처럼 도메인 엔티티 클래스를 슈퍼 타입인 QueryDslRepositorySupport 생성자의 아규먼트로 넘겨줘야 한다.

profile
Step by step goes a long way ✨

0개의 댓글