QueryDSL이란
Querydsl 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 프레임워크다. 문자열로 작성하거나 XML 파일에 쿼리를 작성하는 대신, Querydsl이 제공하는 플루언트(Fluent) API를 이용해서 쿼리를 생성할 수 있다.
단순 문자열과 비교해서 Fluent API를 사용할 때의 장점은 다음과 같다.
- IDE의 코드 자동 완성 기능 사용
- 문법적으로 잘못된 쿼리를 허용하지 않음
- 도메인 타입과 프로퍼티를 안전하게 참조할 수 있음
- 도메인 타입의 리팩토링을 더 잘 할 수 있음
Maven 설정은 다음과 같다.
1. pom.xml
<plugins>
....
<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>
....
<plugins>
<!-- QueryDSL APT Config -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<!-- QueryDSL JPA Config -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
2. 엔티티 클래스 생성 (Hello.java)
package com.book.userservice;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Hello {
@Id @GeneratedValue
private Long id;
private String name;
public Hello(String name){
this.name = name;
}
}
테스트하고싶은 엔티티를 생성합니다.
3. Generate Sources and Update Folders
mvn clean install 을 실행하면, target/generated-sources/java 디렉토리에 Query가 생성됩니다.
4. 테스트 코드 작성
package com.book.userservice;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import static org.assertj.core.api.Assertions.assertThat;
@Transactional
@SpringBootTest
class HelloTest {
@PersistenceContext
EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello("TEST");
em.persist(hello);
em.flush();
em.clear();
QHello h = new QHello("m"); // variable -> 별칭
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
Hello data = queryFactory
.selectFrom(h)
.fetchOne();
assertThat(data.getName()).isEqualTo("TEST");
}
}
다음은 단위테스트 결과입니다.
성공적으로 Hibernate가 쿼리를 작성한 모습을 볼 수 있습니다.
이렇게 Maven 기반 QueryDsl 설정을 마쳤습니다.
첫줄에서 말했듯이 QueryDsl은 동적쿼리를 쉽게 만들어주고 JPQL에서 String type으로 쿼리를 작성하던 것 과는 다르게 컴파일 레벨에서 오류를 잡아줘서 개발자들의 생산성을 올리는데 매우 좋습니다. 짱짱!
'개발 > JAVA' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (0) | 2021.05.14 |
---|