쿼리를 자바 코드로 작성 할 수 있게 해주는 프레임워크
JPA 로 작성하기 힘든 쿼리를 작성하기 편리하게 도와줌
Querydsl 은 프로젝트 내에 @Entity
어노테이션을 통해 선언해준 클래스를 탐색 후 Q Class 를 생성해 준다
엔티티로 등록된 클래스들 앞에 Q 라는 접두사가 붙은 형태로 자동 생성되고, 해당 클래스를 사용함으로써 쿼리를 Type-Safe 하게 작성 가능
Q Class 의 경우 git 에 올라가면 안 되므로 기본적으로 .gitignore 에 추가 되어있는 build 폴더 아래 생성하도록 설정해준다
// querydsl 사용할 경로 지정합니다. 현재 지정한 부분은 .gitignore에 포함되므로 git에 올라가지 않습니다.
def querydslDir = "$buildDir/generated/'querydsl'" as Object
// JPA 사용여부 및 사용 경로 설정
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
// build시 사용할 sourceSet 추가 설정
sourceSets {
main.java.srcDir querydslDir
}
<aside> 💡 SourceSets 이란? Gradle에서는 하나의 Source 디렉터리만 지원을 해준다 ( src/main/java ) SourceSets 은 이러한 제약사항을 지원하기 위해 사용이 됨 SourceSets 은 Java 소스와 리소스 파일의 논리적인 그룹을 나타내준다 하나 이상의 Source 디렉리를 Gradle 에서 처리를 하기 위해서 SourceSets 에 Source 디렉터리를 등록해 주면 됨
</aside>
자동으로 생선된 Q Class
Querydsl Config 생성
@Configuration
public class QuerydslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
Config 설정을 통해 JPAQueryFactory 를 빈에 등록하여 Repository 에서 사용
Repository Naming
Repository은 네이밍 규약을 잘 지켜야 한다. 별도의 설정을 하지 않았다면, ~Impl
접미사를 붙여야만 스프링이 찾을 수 있다. 관련해서는 spring-data
에 포함 된RepositoryConfigurationSourceSupport
클래스와 AnnotationRepositoryConfigurationSource
클래스의 내부 코드를 보면 알 수 있다.
~Repository, ~RepositoryCustom, ~RepositoryImpl
3개의 파일을 이용한 방식으로 가장 보편적으로 사용 하는 방식
~RepositoryCustom
이라는 이름으로 구현할 Querydsl 메서드의 시그니처를 정의 한다.
UserRepository
public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {
}
UserRepositoryCustom
public interface UserRepositoryCustom {
List<User> getUserList();
}
UserRepositoryImpl
@Repository
public class UserRepositoryImpl implements UserRepositoryCustom {
private final JPAQueryFactory queryFactory;
public UserRepositoryImpl(JPAQueryFactory queryFactory) {
this.queryFactory = queryFactory;
}
QUser user = QUser.user;
@Override
public List<User> getUserList() {
return queryFactory
.selectFrom(user)
.fetch();
}
}
상속/구현 없는 Repository
UserRepository (기본 Spring Data JPA Repository)
public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {
}
UserRepositoryImpl (Querydsl 용 Repository)
@Repository
public class UserRepositoryImpl {
private final JPAQueryFactory queryFactory;
public UserRepositoryImpl(JPAQueryFactory queryFactory) {
this.queryFactory = queryFactory;
}
// ... 구현할 메소드 정의
}
상속/구현이 필요없지만 Spring Data JPA 와 Querydsl 2가지를 전부 사용하려면 사용하려는 곳에서 2가지 Repository 를 주입해야 하는 단점이 있다.
QuerydslRepositorySupport
를 상속한 방식