단순하게 CRUD기능을 구현하기 위해 생각보다 많은 자원을 투자했다,
그런 단순작업이 지겨워진? 분들은 Spring Data JPA를 찾아 단순한 CRUD의 작업을 더욱더 단순화하여 쉽게 사용하시게 되는데
이는 단순히 JPA 하나만으로 되는 기능이 아니라 Hibernate와 함께 동작되는 것으로 Hibernate 내용도 숙지해야 한다.
간단하게 CRUD 할때는 문제가 없지만.
복잡하게 얼힌 데이터들의 내용을 불러오기 위해서는 JOIN이 필요하다.
사실 이내용도 master Key와 엮여 있는 Entity들을 설정에서 레이지로딩, Eager 로딩으로(정책에 따라 다르지만)
할수있다.
하지만!! 조회 할때는...? 그렇다...
이때는 Criteria, QueryDSL, JPQL을 이용하야 할것이다.
헌데 Criteria, JPQL 은 타이핑시에 오류가 발생할수 있기때문에 타입세이프 하지 않다고하여
QueryDSL을 이용하여 타입세이프 하게 만들수있다.
조인쿼리를 만들고난뒤에 페이지을 해야 하는데. 여기서 제공하는 API가 있을까? 물론 있다.
하지만 더좋은것이 있다.
바로 ~ QueryDslJpaRepository.findAll 에서 사용하는 메소드이다.
@Override
public Page<T> findAll(Predicate predicate, Pageable pageable) {
JPQLQuery countQuery = createQuery(predicate);
JPQLQuery query = querydsl.applyPagination(pageable, createQuery(predicate));
Long total = countQuery.count();
List<T> content = total > pageable.getOffset() ? query.list(path) : Collections.<T> emptyList();
return new PageImpl<T>(content, pageable, total);
}
이녀석을 오버라이딩 해서 사용하는 것이다.(오버라이딩 하지 않고 만들어도 상관없다.)
Query를 JPQL로 만들어서 최종 사용하기때문에 아래 샘플처럼 위 메소드를 호출 하여 사용하도록 하자.
* 샘플