QueryDSL
- JPQL을 편하게 작성하도록 도와주는 빌더 클래스 모음으로, 문자가 아닌 코드 기반이기 때문에 문법 오류를 컴파일 단계에서 잡아낼 수 있다.
- 비표준 오픈소스 프로젝트로, JPA 뿐만 아니라 JDO, 몽고DB, Java 컬렉션 등도 거의 같은 문법으로 지원한다.
특징
- 쿼리 DSL의 핵심은 타입 안정성으로, 도메인 타입의 프로퍼티를 반영해서 생성한 쿼리 타입(Q)을 이용해서 쿼리를 작성한다.
- 또한 Query 인터페이스는 공통의 상위 인터페이스를 가지므로, 기반 기술에 상관없이 쿼리 경로와 오퍼레이션 모두 일관성있게 사용할 수 있다.
JPA 쿼리
의존성 추가
// Spring Data JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.querydsl:querydsl-jpa' // QueryDSL JPA 라이브러리
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa' // Qclass 생성에 필요한 라이브러리
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
- QueryDSL을 사용하려면 엔티티를 기반으로 쿼리 타입(Q)이라는 쿼리용 클래스(Qclass)를 생성해야 하는데, 의존성을 추가하면 JPAAnnotationProcessor가 @Entity 어노테이션을 가진 도메인 타입을 찾아서 쿼리 타입을 생성해준다.
- Build and run using이 IntelliJ IDEA로 되어있는 경우 src/main/generated 경로에 Qclass가 생성된다.
- 이후 생성된 쿼리 타입을 이용해서 JPA 쿼리 인스턴스와 쿼리 도메인 모델 인스턴스를 생성할 수 있다.
쿼리 타입
Entity
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
@Column(unique = true, nullable = false)
private String email;
@Column(nullable = false)
private String name;
// 생략
}
Qclass
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QMember extends EntityPathBase<Member> {
private static final long serialVersionUID = 1185894155L;
public static final QMember member = new QMember("member1");
public final StringPath email = createString("email");
public final NumberPath<Long> id = createNumber("id", Long.class);
public final StringPath name = createString("name");
public QMember(String variable) {
super(Member.class, forVariable(variable));
}
public QMember(Path<? extends Member> path) {
super(path.getType(), path.getMetadata());
}
public QMember(PathMetadata metadata) {
super(Member.class, metadata);
}
// 생략
}
- Qclass는 기본 인스턴스 변수를 가지며, 정적 필드로 접근하거나 변수를 직접 정의할 수 있다.
QMember member = QMember.member;
QMember member = new QMember("memberA");
JPAQueryFactory
QueryDslConfig
- QueryDsl을 사용하려면 JpaQueryFactory가 필요하므로 설정파일에서 Bean으로 등록한다.
@NoArgsConstructor
@EnableJpaAuditing
@Configuration
public class QueryDslConfig {
@PersistenceContext
private EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em);
}
}
Repository
@RequiredArgsConstructor
@Repository
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
private final JPAQueryFactory queryFactory;
QMember member = QMember.member;
}
※ 참고 문헌: http://querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/#jpa_integration
'Spring > JPA' 카테고리의 다른 글
영속성 컨텍스트와 연속성 관리 (0) | 2022.03.05 |
---|---|
N+1 문제와 해결 방법 (0) | 2022.03.05 |
JPA와 ORM (0) | 2022.02.23 |
JPQL과 페치 조인 (0) | 2022.02.23 |
스프링 데이터 JPA (0) | 2022.01.23 |