QueryDSL
- 자바를 위한 동적 쿼리 작성을 위한 오픈 소스 라이브러리
- QueryDSL은 정적 타입 검사 및 코드 자동 완성을 제공하여, 쿼리 작성 시 발생할 수 있는 오류를 사전에 방지하고, 쿼리 작성을 더 편리하게 만들어준다.
의존성 추가
implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")
annotationProcessor("jakarta.persistence:jakarta.persistence-api")
- implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
- QueryDSL을 사용하여 JPA 기반의 데이터베이스 쿼리를 생성하고 실행하는 데 필요한 클래스와 기능을 제공
- annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")
- 컴파일 타임에 엔티티 클래스를 기반으로 Q 클래스를 생성하여 QueryDSL을 사용할 때 타입 안전한 쿼리를 작성할 수 있도록 도와줌
- annotationProcessor("jakarta.annotation:jakarta.annotation-api")
- Jakarta EE 표준 애노테이션을 제공
- @PostConstruct, @PreDestroy 등의 애노테이션을 사용하여 라이프사이클 이벤트를 처리할 수 있음
- annotationProcessor("jakarta.persistence:jakarta.persistence-api")
- Jakarta EE 표준 JPA 사양을 제공
- @Entity, @Table, @Column 등의 JPA 관련 애노테이션을 사용하여 엔티티 클래스와 데이터베이스 테이블 간 매핑을 설정할 수 있음
QueryDslConfiguration
package me.progfrog.couponcore.configuration;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@RequiredArgsConstructor
@Configuration
public class QueryDslConfiguration {
@PersistenceContext
private final EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
이 경로에서 compileJava를 실행해 주면
여기에 기존의 Entity 이름 앞에 Q가 붙은 QEntity가 생성된다.
Rebuild Project를 하면
여기에 기존의 Entity 이름 앞에 Q가 붙은 QEntity가 생성된다.
QEntity는 QueryDSL에서 엔티티를 나타내는 클래스로, QueryDSL을 사용하여 쿼리를 작성할 때 사용한다. 만약 QEntity를 생성한 뒤 기존 Entity에 변경이 생겼다면 다시 한번 위의 과정을 거쳐줘야 한다! 자동으로 QEntity가 만들어지는 것이 아님에 유의하자.
CouponIssueRepository
package me.progfrog.couponcore.repository.mysql;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import me.progfrog.couponcore.model.CouponIssue;
import org.springframework.stereotype.Repository;
import static me.progfrog.couponcore.model.QCouponIssue.couponIssue;
@RequiredArgsConstructor
@Repository
public class CouponIssueRepository {
private final JPAQueryFactory queryFactory;
public CouponIssue findFirstCouponIssue(long couponId, long userId) {
return queryFactory.selectFrom(couponIssue)
.where(couponIssue.couponId.eq(couponId))
.where(couponIssue.userId.eq(userId))
.fetchFirst();
}
}
관련 개인 프로젝트
GitHub - happyprogfrog/coupon-sample: 선착순 쿠폰 발급 시스템 <인생은선착순>
선착순 쿠폰 발급 시스템 <인생은선착순>. Contribute to happyprogfrog/coupon-sample development by creating an account on GitHub.
github.com
반응형