[Querydsl] Spring boot + JPA 에서 Querydsl 사용하기

YJ KIM·2022년 10월 21일
0

목차

  1. Querydsl 설정
  2. JPA Repository에서 Querydsl 사용하기

현재 Spring boot + Spring data JPA 로 CRUD를 수행하고 있다.
하지만 단순한 검색을 넘어서 일정 퀄리티의 검색을 구현하기 위하여, 동적 쿼리와 서브 쿼리를 이용해야 하는 일이 발생했다 (ㅠㅠ)

원래는 JPA Specification을 이용하여 동적 쿼리를 작성하여 진행하려고 했으나 Specification은 서브 쿼리를 사용할 수 없어서 Querydsl을 사용하기로 결정했다.

1. Querydsl 설정

Querydsl을 사용하여 쿼리 코드를 빌드하기 위해서는 JPAQueryFactory가 필요하다. 이를 Bean으로 설정하여 JPAQueryFactory를 프로젝트에서 사용할 것이다.

JPAQueryFactory는 EntityManager를 주입받아 생성할 수 있다.

@Configuration
@NoArgsConstructor
public class QuerydslConfiguration {
    EntityManager em;

    @Bean
    public JPAQueryFactory jpaQueryFactory(){
        return new JPAQueryFactory(em);
    }
}

2. JPA Repository에서 Querydsl 사용하기

현재 사용하는 Spring data JPA의 Repositroy 구조에서 Querydsl을 사용할 것이다.

사용하기 위해서는

  1. custom Repository interface 생성
  2. custom Repository impl (1의 구현 클래스) 생성
    -> 이 곳에서 JPAQueryFactory를 주입받아, 쿼리 코드를 작성함
  3. 기존 Repository에 custom Repository interface를 상속하도록 한다

위 과정을 통하여 기존 Repository에서 Querydsl을 이용한 쿼리 메소드를 사용할 수 있다!

1. custom Repository interface 생성

public interface DslRepository {
}

이곳 안에 필요한 쿼리 메소드를 선언하면 된다.
-> DslRepositoryImpl에서 해당 메소드를 정의하면 사용할 수 있다.

2. custom Repository Impl 생성

@Repository
@RequiredArgsConstructor
public class DslShopRepositoryImpl implements DslShopRepository{

    private final JPAQueryFactory queryFactory;
}

위와 같이 queryFactory를 @RequiredArgsConstructor 어노테이션을 이용해 주입해주었다.

🚨 Impl 클래스에서 DslRepository에서 선언한 메소드를 override 해주면 된다.

3. 기존 Repository에 custom Repository interface 상속하기

현재 기존 Repository는 Spring data JPA를 사용하고 있다.

@Repository
public interface Repository extends JpaRepository<Entity, Long>, DslRepository {

...

}

기존 spring Data JPA는 JPARepository를 상속받아야 했다. 여기에 위에서 구현한 DslRepository까지 상속받도록 하여 QueryDsl로 정의한 쿼리 메소드를 사용할 수 있도록 한다.

profile
모르면 쓰지 말고 쓸 거면 알고 쓰자

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN