(spring)(실전! Querydsl_03)

전성영·2022년 8월 9일
1

spring

목록 보기
27/31

순수 JPA 리포지토리와 Querydsl


방법 1



방법 2

동적 쿼리와 성능 최적화 조회 - Builder 사용

StringUtils.hasText를 이용하여 null이거나 "" 가 아닐 때를 가려낸다.

hasText를 타고 들어가면

이런 친구라는 것을 알 수 있다.

무튼 조건들이 성립할 때마다 builder에 차곡차곡 쌓는다.
Querydsl 짱!

다음으로는 동적 쿼리를 만들 때
Builder 사용이 아닌 where 절 사용을 알아볼 것이다.

동적 쿼리와 성능 최적화 조회 - where절 파라미터 사용

where절을 이용하면 보다 직관적으로 바뀐다.

조회 API 컨트롤러 개발

테스트는 postman으로 확인해보았다.

localhost:8090/v1/members 에서 뒤에 ? 를 붙인다.
localhost:8090/v1/members?teamName=teamB&ageGoe=31&..... 이런식으로 확인해볼 수 있다!!

스프링 데이터 JPA 리포지토리로 변경 & 사용자 정의 리포지토리

Custom 인터페이스를 구현해준 후 사용할 메서드를 선언해준다.

방금 만든 Repository인 MemberRepositoryCustom을 상속받는다.
그렇게 되면 외부에서도 사용이 가능하다!

마지막으로 아까 만들었던 MemberRepositoryCustom을 구현체로 한 MemberRepositoryImpl에서 메소드를 만들면 된다!


MemberRepository는 JpaRepository를 상속받는다.
또한 MemberRepositoryCustom도 상속받는다.
MemberRepositoryCustom에 대한 구현체는 MemberRepositoryImpl이라는 구현체로 구현을 해준다.
조건은 구현체의 이름이 [MemberRepository] + Impl 이름을 맞춰주면 된다!

특정 API에 종속이 되어있다면 별도로 Repository를 만들고 Injection을 받아서 사용하면 된다!

스프링 데이터 페이징 활용1

repo

service

먼저 간단하게 하는 방법이다.
offset과 limit 그리고 fetchResults를 이용하여 Paging 처리를 해줄 수 있다.
리턴값도 유심히 보자!


다음으론 count 쿼리까지 한번에 쏘는 fetchResults를 쓰는것이 아닌, 직접 두 가지를 만드는 것이다.

이렇게 나눴을 때의 이점은 count 쿼리를 최적화 할 수 있다는 것이다.
ex) count 쿼리에서 조인이 필요없을 때는 빼는?? 그런 느낌?

CountQuery 최적화

count 쿼리가 생략 가능한 경우 생략해서 처리

  • 페이지 시작이면서 컨텐츠 사이즈가 페이지 사이즈보다 작을 때
  • 마지막 페이지 일 때 (offset + 컨텐츠 사이즈를 더해서 전체 사이즈 구함)


PageableExecutionUtils.getPage()를 통해 countQuery의 최적화를 할 수 있다.


스프링 데이터 Sort를 Querydsl의 OrderSpecifier로 변환
추후에 자세히 다룬다.

JPAQuery<Member> query = queryFactory
 .selectFrom(member);
for (Sort.Order o : pageable.getSort()) {
 PathBuilder pathBuilder = new PathBuilder(member.getType(),
member.getMetadata());
 query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,
 pathBuilder.get(o.getProperty())));
}
List<Member> result = query.fetch();

참고: 정렬( Sort )은 조건이 조금만 복잡해져도 Pageable 의 Sort 기능을 사용하기 어렵다.
루트 엔티티 범위를 넘어가는 동적 정렬 기능이 필요하면 스프링 데이터 페이징이 제공하는 Sort 를 사용하기 보다는 파라미터를 받아서 직접 처리하는 것을 권장한다.

스프링 데이터 JPA가 제공하는 Querydsl 기능은 남겨두기로 했다!!

profile
Slow and Steady

2개의 댓글

comment-user-thumbnail
2022년 8월 10일

이 글 어디서 본 것 같은데 복붙하신거 아닌가요?

1개의 답글