이를 활용하면 SQL문을 최대한 지양하고 Java로 개발할 수 있다.
query dsl을 기반으로 Repository로 활용할 수 있는 법은 크게 세가지가 있다.
일반적인 findbyId()와 같이 JpaRepositry에서 지원하는 기능들을 최대한 활용한채 동적인 쿼리나 복잡한로직의 쿼리에 한해서 query dsl repository에서 담당하도록 짜게 되는데 두개의 repository를 가짐으로써, 모든 도메인에 관한 Repository는 2개씩 가지게 되고 각 서비스단에서도 두개씩 가지게 됨으로써 상당히 번거로워진다.
하나의 query dsl repository에서 모든 필요한 메서드를 작성하여야 하는데 굳이 data jpa를 이용하면 쉽게 구현가능한것들에 대해 다 작성해야 하니 이또한 번거롭다.
Data jpa에서 사용자가 직접구현한 CustomRepository와 합칠 수 있도록 기능을 구현하고 있다. 단 규칙이 있다.
인터페이스: RepositoryCustom
구현체: RepositoryCustomImpl
다음과 같이 Custom과 CustomImpl을 붙여서 작성하여야 한다. 예를 들어보자.
1.MemberRepositoryCustom:인터페이스
public interface MemberRepositoryCustom {
List<Member> findAll();
List<Member> findByName(String name);
}
2.MemberRepositoryCustomImpl :구현체
@Repository
@RequiredArgsConstructor
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
private final JPAQueryFactory query;
@Override
public List<Member> findAll() {
return query.selectFrom(member).fetch();
}
@Override
public List<Member> findByName(String name) {
return query.selectFrom(member).
where(member.name.eq(name)).fetch();
}
}
3.최종 repository
@Repository
public interface MemberRepository extends JpaRepository<Member,Long> , MemberRepositoryCustom{
List<Member> findByAddress_City(String City);
}
이렇게 사용함으로써 하나의 Repository에서 동적쿼리영역 및 data jpa를 전적으로 활용하고 편리하게 사용되는것을 알 수 있다.