목차
- Querydsl 설정
- JPA Repository에서 Querydsl 사용하기
현재 Spring boot + Spring data JPA 로 CRUD를 수행하고 있다.
하지만 단순한 검색을 넘어서 일정 퀄리티의 검색을 구현하기 위하여, 동적 쿼리와 서브 쿼리를 이용해야 하는 일이 발생했다 (ㅠㅠ)
원래는 JPA Specification을 이용하여 동적 쿼리를 작성하여 진행하려고 했으나 Specification은 서브 쿼리를 사용할 수 없어서 Querydsl을 사용하기로 결정했다.
Querydsl을 사용하여 쿼리 코드를 빌드하기 위해서는 JPAQueryFactory가 필요하다. 이를 Bean으로 설정하여 JPAQueryFactory를 프로젝트에서 사용할 것이다.
JPAQueryFactory는 EntityManager를 주입받아 생성할 수 있다.
@Configuration
@NoArgsConstructor
public class QuerydslConfiguration {
EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory(){
return new JPAQueryFactory(em);
}
}
현재 사용하는 Spring data JPA의 Repositroy 구조에서 Querydsl을 사용할 것이다.
사용하기 위해서는
- custom Repository interface 생성
- custom Repository impl (1의 구현 클래스) 생성
-> 이 곳에서 JPAQueryFactory를 주입받아, 쿼리 코드를 작성함- 기존 Repository에 custom Repository interface를 상속하도록 한다
위 과정을 통하여 기존 Repository에서 Querydsl을 이용한 쿼리 메소드를 사용할 수 있다!
public interface DslRepository {
}
이곳 안에 필요한 쿼리 메소드를 선언하면 된다.
-> DslRepositoryImpl에서 해당 메소드를 정의하면 사용할 수 있다.
@Repository
@RequiredArgsConstructor
public class DslShopRepositoryImpl implements DslShopRepository{
private final JPAQueryFactory queryFactory;
}
위와 같이 queryFactory를 @RequiredArgsConstructor 어노테이션을 이용해 주입해주었다.
🚨 Impl 클래스에서 DslRepository에서 선언한 메소드를 override 해주면 된다.
현재 기존 Repository는 Spring data JPA를 사용하고 있다.
@Repository
public interface Repository extends JpaRepository<Entity, Long>, DslRepository {
...
}
기존 spring Data JPA는 JPARepository를 상속받아야 했다. 여기에 위에서 구현한 DslRepository까지 상속받도록 하여 QueryDsl로 정의한 쿼리 메소드를 사용할 수 있도록 한다.