[Querydsl] 스프링 데이터 JPA와 Querydsl
스프링 데이터 JPA와 Querydsl
스프링 데이터 JPA Repository로 변경
public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findByUsername(String username);
}
테스트 코드
@SpringBootTest
@Transactional
class MemberRepositoryTest {
    @Autowired EntityManager em;
    @Autowired MemberRepository memberRepository;
    @Test
    void basicTest() {
        Member member = new Member("member1", 10);
        memberRepository.save(member);
        Member findMember = memberRepository.findById(member.getId()).get();
        assertThat(findMember).isEqualTo(member);
        List<Member> result1 = memberRepository.findAll();
        assertThat(result1).containsExactly(member);
        List<Member> result2 = memberRepository.findByUsername("member1");
        assertThat(result2).containsExactly(member);
    }
}
- Querydsl 전용 기능인 회원 search를 작성할 수 없다.(동적 쿼리)
    - -> 사용자 정의 리포지토리 필요.
 
사용자 정의 리포지토리
사용자 정의 리포지토리 사용법
- 사용자 정의 인터페이스 작성
- 사용자 정의 인터페이스 구현
- 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속
사용자 정의 리포지토리 구성

1. 인터페이스 작성
public interface MemberRepositoryCustom {
    List<MemberTeamDto> search(MemberSearchCondition condition);
}
2. 인터페이스 구현
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
                .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 StringUtils.hasText(username) ? member.username.eq(username) : null;
    }
    private BooleanExpression teamNameEq(String teamName) {
        return StringUtils.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 ageGoe != null ? member.age.loe(ageLoe) : null;
    }
}
3. 스프링 데이터 리포지토리에 상속
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
    
    ...
}
<출처 : 인프런 - 실전! Querydsl(김영한)>
댓글남기기