실전! Querydsl

Ch05. 실무 활용(스프링 데이터 JPA와 Querydsl) - 사용자 정의 리포지토리

webmaster 2022. 1. 2. 11:14
728x90

SpringDataJpa는 내가 원하는 구현 코드를 넣기 위해서는 사용자 정의 인터페이스를 만들어야 한다.

  • 사용자 정의 리포지토리 사용법
    • 사용자 정의 인터페이스 작성
    • 사용자 정의 인터페이스 구현 
    • 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속

사용자 정의 레포지토리 구성
Custom Interface 생성

public class MemberRepositoryImpl implements MemberRepositoryCustom{
    private final JPAQueryFactory queryFactory;

    public MemberRepositoryImpl(EntityManager em) {
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public List<MemberTeamDto> search(MemberSearchCondition condition){
        return queryFactory
                //SelectionProjection 이 변경되어도 재사용이 가능하다.
                .select(new QMemberTeamDto(
                        member.id.as("memberId"),
                        member.username,
                        member.age,
                        team.id.as("teamId"),
                        team.name.as("teamName")
                ))
                .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 ageBetween(int ageLoe,int ageGoe){
        return ageLoe(ageLoe).and(ageGoe(ageGoe));
    }

    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;
    }
}

 

  • Custom Interface를 구현한 Custom Class를 직접 구현하여준다
  • 구현한 CustomClass 같은 경우 MemberRepository + " ~~" + Impl 이러한 형식으로 생성해야 한다.
  • 만약 화면이 너무 복잡하여 화면에 종속적인 Repository를 만들어야 된다면 따로 Query라는 Repository를 만들어 해당 Repository에서 따로 구현하여도 된다(아키택처 부분)

Query Repository를 만들어 화면에 종속적인 Repository 작성(CQRS)

커맨드와 쿼리를 분리한다.

SpringDataJpa Interface에서 CustomInterface를 상속받으면된다.
Test

728x90