간단한 정적인 쿼리들은 스프링 데이터 JPA만을 사용하여 가능하지만, 동적인 쿼리를 위해서는 Query dsl이 필요하다. 하여 이 둘을 같이 쓸 필요가 있는데, 스프링 데이터 JPA를 사용한 리포지토리는 JpaRepository<Entity, ID>를 extends하여 만들어지고, Querydsl은 일반적인 class를 사용하여 만들어진다. 하여 서비스 계층에서 Repository를 사용할 때 두 개의 리포지토리를 주입 받아야 하는 것이다.
하나의 리포지토리만 주입받아 사용하기 위한 방법을 알아보자.
먼저 아래와 같은 리포지토리 인터페이스가 있다고 하자.
public interface MemberRepositoryCustom {
List<MemberTeamDto> search(MemberSearchCondition condition);
}
위의 search 메서드는 Query dsl을 사용하여 만들어야 하는 동적인 쿼리이다.
하여 위의 인터페이스를 구현하는 Query dsl 리포지토리를 만든다.
public class MemberRepositoryImpl implements MemberRepositoryCustom{
private final JPAQueryFactory queryFactory;
public MemberRepositoryImpl(EntityManager entityManager) {
this.queryFactory = new JPAQueryFactory(entityManager);
}
@Override
public List<MemberTeamDto> search(MemberSearchCondition condition) {
return queryFactory
.select(new QMemberTeamDto(
member.id,
member.username,
member.age,
team.id,
team.name
))
.from(member)
.leftJoin(member.team, team)
.where(
usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe())
)
.fetch();
}
private BooleanExpression usernameEq(String username) {
return hasText(username) ? member.username.eq(username) : null;
}
private BooleanExpression teamNameEq(String teamName) {
return hasText(teamName) ? team.name.eq(teamName) : null;
}
private BooleanExpression ageGoe(Integer ageGoe) {
return ageGoe!=null ? member.age.goe(ageGoe) : null;
}
private BooleanExpression ageLoe(Integer ageLoe) {
return ageLoe!=null ? member.age.loe(ageLoe) : null;
}
}
이제 스프링 데이터 JPA를 사용하는 리포지토리는 JpaRepository<Entity, ID>와 MemberReposiotyCustom 인터페이스 모두를 implements하면 되는 것이다.
public interface MemberRepository extends JpaRepository<Member, Long> , MemberRepositoryCustom{
List<Member> findByUsername(String username);
}
해당 리포지토리는 JpaRepoitory를 implements하기 때문에 메서드 명으로 쿼리를 만들어주는 스프링 데이터 jpa의 기능을 사용할 수 있고, MemberRepositoryCustom을 implements하기 때문에 해당 인터페이스에 명시된 search메서드도 사용할 수 있게 되었다.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
'JPA > Querydsl' 카테고리의 다른 글
Querydsl 16 - 페이징 컨트롤러 개발 (0) | 2022.01.30 |
---|---|
Querydsl 15 - data jpa + query dsl 페이징 (0) | 2022.01.30 |
Querydsl 13 - 조회 API 컨트롤러 개발 (0) | 2022.01.22 |
Querydsl 12 - 동적쿼리와 성능 최적화 조회(where 절 파라미터) (0) | 2022.01.22 |
Querydsl 11 - 순수 JPA 리포지토리와 Querydsl, 동적쿼리 Builder (0) | 2022.01.21 |