이 기능들을 실무에서 자주 사용하지는 않는다.
마지막에 나오는 네이티브 쿼리
는 들어두면 좋다.
스프링 데이터 JPA는 JPA Criteria
를 활용해서 이 개념을 사용할 수 있도록 지원
하지만, JPA Criteria
는 너무 복잡하고 코드가 더러워서 실무에서는 금지시키는 경우도 많음
술어
org.springframework.data.jpa.domain.Specification
클래스로 정의명세 기능 사용 방법
JpaSpecificationExcutor
를 넣으면 사용가능
Criteria
문법이 들어가 있어서 내용 이해가 잘 안된다.
이런 식으로 조건 입력이 가능하다.
하지만, 실무에서는 거의 안쓴다. 대신에 QueryDSL을 사용하자.
Probe
: 필드에 데이터가 있는 실제 도메인 객체
ExampleMacher
: 특정 필드를 일치시키는 상세한 정보 제공, 재사용 가능
Example
: Probe
와 ExampleMatcher
로 구성, 쿼리를 생성하는데 사용
장점
단점
INNER JOIN
)만 가능하다.LEFT JOIN
) 안됨firstname = ?0 or (firstname = ?1 and lastname = ?2)
starts/contains/ends/regex
=
)만 지원실무에서는 QueryDSL을 사용하자
앞에 것들은 다 도움이 안되는 것들인데,
이건 도움이 될 때가 있다.
이름만 검색하기 위한 인터페이스를 생성한다.
그리고 MemberRepository
에 이렇게 메서드를 추가한다.
이렇게 테스트를 하게 되면,
스프링 데이터가 프록시를 잘 이용해서, UsernameOnly
인터페이스는 프록시가 되고, 딱 이름만 검색해서 데이터를 가져오게 된다.
추가로 이렇게 설정할 경우,
엔티티 전체를 검색한 다음, 조건을 찾고 문법에 맞게 저장된다.
이번엔 클래스를 이용해보자.
여기서 이 파라미터가 중요하다. 이 파라미터를 기준으로 검색을 한다.
바꾸고
이렇게 실행하면,
잘 된다.
참고로 쿼리가 똑같지만, 다른 Dto
로 받는 형식을 만들고 싶다면 이와같이 클래스를 받게 만들면 된다.
그럼 이렇게 클래스에 맞춰서 형태가 맞춰진다.
이번에는 중첩 검색을 해보자.
이와 같이 테스트를 해보면,
이렇게 Member
는 딱 이름만 가져왔으나,
Team
은 엔티티 전체를 검색한 것을 확인할 수 있다.
이처럼 중첩 구조에서 root
인 Member
는 정확한 검색이 가능하지만,
안쪽으로 들어갈때는 엔티티 전체를 조회한다.
정리
root
에서 검색이 끝난다면 Projections
을 활용하자.조금만 복잡해지면,
QueryDSL`을 사용하자.`가급적 네이티브 쿼리는 사용하지 않는게 좋음, 정말 어쩔 수 없을 때 사용
최근에 나온 궁극의 방법 -> 스프링 데이터 Projections 활용
MemberRepository
에 이렇게 작성하면, 네이티브 쿼리라는 것을 알려줄 수 있다.
근데 제약이 많다.
Object[], Tuple, DTO
3개밖에 안됨Sort
처리가 안될수도 있음JPQL
처럼 로딩 시점에 문법 확인 불가 최근에 추가된 페이징 기능