Query DSL
- SQL(관계형 DB 언어, 테이블을 대상으로 함.), JPQL(Spring과 DB를 매핑하는 Spring형 관계형 DB 언어, 객체를 대상으로 함.) 를 대신하여 JPA를 코드로 작성하는 방법
- Spring내의 객체와 매핑되는 QClass라는 객체를 생성하여 이를 기반으로 쿼리를 실행.
(쉽게 생각하면 QClass는 @Entity의 복사본, 컴파일시 만들어진다.)
장점
- 컴파일시 오류를 발견 가능
(Native Query를 사용하는 경우와 JPA를 사용하는 경우는 결과적으로 SQL문을 직접 작성하는 경우가 생기거나 적어도 칼럼명 등 개발자가 작성하는 부분이 생기는데 컴파일 시 오류가 나는지 알 수 없어서 나중에 오류가 발생할 경우가 크다. 하지만 Query DSL은 오류를 컴파일 시 잡아주어 이를 해결)
- 메서드 등을 통해서 동작하기에 좀 더 객체 지향적.
- 문자로 작성하는 것이 아니기에 오타에 대한 부담이 적음.
기본 사용
1. Dependancy 설정
1-1. JAVAX를 사용한 Entity를 QClass로 만드는 경우
- querydsl-apt : QClass 생성을 위한 라이브러리
- querydsl-jpa : Query DSL을 사용하기 위한 라이브러리
<!-- Querydsl dependencies -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
1-1. PlugIn 설치 및 프로젝트 컴파일
- 아래와 같이 작성시 target/generated-sources/java 파일에 QClass가 생성될 것이다.
- 해당 경로는 Build Path에 등록하여야 한다.
<!-- Query DSL -->
<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>
1-2. JAKARTA를 사용한 Entity를 Q Class로 만들기
- 각 Dependancy의 역할은 위와 같다.
- 플러그인이 필요가 없다.
- target/generated-sources/annotations 아래에 생성
- Build-Path 설정 필요
<!-- Querydsl Q Class -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
<scope>provided</scope>
</dependency>
<!-- Querydsl JPA -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>5.0.0</version>
<classifier>jakarta</classifier>
</dependency>
이 후, 명령창에 컴파일하여 생성한다.
mvn clean compile
2. Config 설정
- 빈을 등록을 해서 전역에서 사용가능하게 한다.
- @PersistenceContext : 쓰레드마다 entityManagerFactory가 새로 생성한 entityManager를 주입받아 사용하거나 Transaction안에 기존에 생성되었던 entityManager를 주입할 수 있게 해준다. 이는 여러 쓰레드가 한 entityManager에 동시에 접속하지 않게 막는다. 따라서 thread-safe 하게 만들어준다.
@Configuration
public class QueryDSLConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
이제 Query DSL을 사용할 수 있다.
사용하는 방법에는 여러가지가 있다 기본적으로 JPARepository 와 사용하고자하는 내용을 설정해둔 Query DSL Repository를 상속받은 인터페이스를 구현해 사용한다. 굉장히 복잡하며 모든 것을 연결한다면 굉장한 비용이 발생한다 따라서, JPAQueryFactory를 그냥 주입받아 사용한다. 아래와 같이 사용하여도 문제없이 사용가능하다.
3. JPAQueryFactory를 사용
- 사용하고자 하는 DAO에서 빈을 주입받아서 사용한다.
private final JPAQueryFactory queryFactory;
// 이 후 생성자를 통해 이를 주입받아 사용하고자하는 클래스에서 사용
4. 기본 구조
- 사용하고자 하는 Entity의 QClass를 생성한다.
- 이후 사용한다.
기본 구조
QStoreEntity now = QStoreEntity.storeEntity;
StoreEntity result = queryFactory. (이하생략)
'Server Development > Data API' 카테고리의 다른 글
mappedBy, Cascade (0) | 2023.07.10 |
---|---|
JPA - Query DSL Method (0) | 2023.05.12 |
JPA - Join (0) | 2023.05.09 |
Cache - Redis (0) | 2023.04.06 |
JPA - @Query with Spring JPA (0) | 2023.04.05 |