JpaRepository
의 경우, findAll()
, findById()
등은 자동으로 만들어져 있기 때문에 따로 만들 필요는 없다.
하지만, findByUsername()
과 같이 특정한 필드로 검색해야하는 경우,
findBy
뒤에 필드이름을 쓰게 되면 자동으로 해당 필드로 찾는 쿼리를 작성하는 메서드를 만들어준다.
하지만 이 기능으로는 이러한 자세한 로직을 만들기에는 어렵다.
그렇다면 JpaRepository
에서는 어떻게 이 기능을 만들어야할까?
사용자 정의 리포지토리 사용법
1. 사용자 정의 인터페이스 작성
2. 사용자 정의 인터페이스 구현
3. 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속
중요
만드는 이름 MemberRepository
뒤에 꼭 Impl
을 붙여야한다.(정해진 룰이다.)
이런 식으로 따로 구현한 뒤에 MemberRepository
가 상속받는 방법도 있지만,
구현하는 코드들이 매우 특화된 기능이라면, 따로 리포지토리를 만드는 것도 하나의 방법이다.
곧 없어질 기능이다.
다른 방법으로 하자면, 그냥 fecth()
로 값을 받은 뒤에 List
사이즈를 받아오면 total
로 사용할 수 있지 않나 생각이 든다.
이렇게 쿼리를 한번더 작성하는 방법도 있는데,
이것도 곧 없어지는 기능이다.
이거 역시 size()
로 해결할 수 있지않나 싶다.
JPAQuery
로 받아 fetchCount()
메서드를 람다를 통해 실행함으로써, 최적화를 한다는 것인데 이 역시 기능이 없어지므로 다른 방법을 알아봐야할 것 같다.
Sort
스프링 데이터 JPA는 Sort
를 Querydsl의 정렬(OrderSpecifier
)로 편리하게 변경하는 기능을 제공한다.
그런데 join
이 들어갈때부터 바로 사용할수가 없다.
그러므로 조인들어가기 시작한다면, 스프링 데이터 페이징이 제공하는 Sort
를 사용하기 보다는 파라미터를 받아서 직접 처리하는 것을 권장한다.