정적 타입을 이용해서 SQL 등 쿼리를 생성해주는 프레임워크
JPA 의 쿼리메소드의 한계로 인해 JPQL 을 작성하게 될 경우(예. Limit 구문), 문법 오류 외에는 런타임에서 오류가 발생하는 문제가 있음.
Querydsl 을 통해 코드로 SQL 을 작성하고 이를 컴파일 과정에서 검증할 수 있다.
ext {
querydslVersion = '5.0.0'
}
dependencies {
// queryDSL 설정
implementation "com.querydsl:querydsl-jpa:${querydslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${querydslVersion}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
}
public interface ProjectRepositoryCustom {
/**
* Find by member no limit
*
* @param memberNo {@link Project#getMemberNo()}
* @param limit limit
* @return {@link Project}
*/
Optional<List<Project>> findByMemberNoLimit(Long memberNo, int limit);
}
public class ProjectRepositoryImpl extends QuerydslRepositorySupport implements ProjectRepositoryCustom {
public ProjectRepositoryImpl() {
// QuerydslRepositorySupport 를 통해 QueryFactory 생성없이 사용가능
// Querydsl 에 사용될 엔티티를 생성자로 추가
super(Project.class);
}
@Override
public Optional<List<Project>> findByMemberNoLimit(Long memberNo, int limit) {
var projects = QProject.project;
var projectList = from(projects)
.where(projects.memberNo.eq(memberNo))
.limit(limit)
.fetch();
return Optional.ofNullable(projectList);
}
}
실 사용 시, JPA 와 같이 사용하기 위해 아래와 같이 인터페이스로 사용할 수 있습니다.
// ProjectRepositoryCustom 인터페이스
public interface ProjectRepository extends JpaRepository<Project, Long>, ProjectRepositoryCustom {}
// Querydsl 을 적용할 인터페이스 구체화
public class ProjectRepositoryImpl extends QuerydslRepositorySupport implements ProjectRepositoryCustom {}
Querydsl 을 쉽게 사용할 수 있게 해주는 추상클래스
대상 엔티티를 인자로 생성하여 사용할 수 있다.
// 적용 예시
public class MyEntityRepositoryImpl extends QuerydslRepositorySupport {
public MyEntityRepositoryImpl() {
super(MyEntity.class);
}
...
}