QueryDSL Repository 생성하기 (사용자 정의 리포지토리)

이번시간에는 QueryDSL을 사용하기위핸 QueryDSL 리포지토리를 만드는 방법에 대해 포스팅해보려고 한다.

 

QueryDSL를 사용하기 위해서는 구현 클래스가 필요하고 Spring Data JPA는 인터페이스로 동작한다.

그래서 QueryDSL를 사용하기 위한 사용자 정의 리포지토리(Custom Repository)를 만들고 Spring Data JPA 리포지토리와 연결하는 방법을 알아보자.

 

JPAQueryFactory 빈 등록

QueryDSL을 사용하기 위해서는 JPAQueryFactory를 다음과 같이 Bean 등록 해주어야 한다.

@Configuration
public class QueryDSLConfig {

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

 

Spring Data Jpa 리포지토리

Spring Data Jpa의 리포지토리는 다음과 같고 아래에서 QueryDSL 리포지토리를 만들고 나서 여기에 QueryDSL 리포지토리를 추가해 연결할 것이다.

public interface MemberRepository extends JpaRepository<Member, Long> {
}

 


Custom Repository 생성 후 Spirng Data Jpa Repository와 연결

1. QueryDSL을 사용하기 위한 별도의 사용자 정의 레포지토리를 다음과 같이 인터페이스로 생성한다.

사용자 정의 리포지토리를 생성하는 방법에 대한 내용을 설명하기에 아주 간단한 메서드만을 작성해놓았다.

public interface MemberQueryDSLRepositoryCustom {

    List<Member> findAllMember();
}

 

2. 생성한 인터페이스를 구현하는 구현체 레포지토리를 만든다.

사용자 정의 레포지토리를 만들어 사용할 때 규칙이 있는데, 꼭 Spring Data Jpa 리포지토리 인터페이스명 뒤에 Impl이 붙어야한다.

(MemberRepository + Impl)

@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberQueryDSLRepositoryCustom {
    private final JPAQueryFactory queryFactory; // querydsl을 사용하기 위해 의존성 주입

    @Override
    public List<Member> findAllMember() {
        return queryFactory
                .selectFrom(member)
                .fetch();
    }
}

인터페이스를 구현했기 때문에 findAllMember 메서드를 오버라이딩하여 작성하였다.

 

3. MemberRepository에 QueryDSL 사용자 정의 리포지토리 인터페이스 추가.

Spring Data Jpa 리포지토리가 다음과 같이 QueryDSL 사용자 정의 리포지토리 인터페이스를 상속 받도록 추가해준다.

public interface MemberRepository extends JpaRepository<Member, Long>, MemberQueryDSLRepositoryCustom {
}

 

 

이제 MemberRepository를 의존성 주입 받으면 만들었던 QueryDSL 리포지토리의 메서드도 사용할 수 있게 된다.