이름은 자유롭게 작성 가능!
public interface MemberRepositoryCustom {
List<Member> findMemberCustom();
}
🚨주의🚨
사용자 정의 interface 구현체는 이름을 규칙에 맞게 작성해야한다.
이름 : MemberRepositoryImpl
JpaRepository extends 받은 interface 이름
+Impl
참고!
Spring Data 2.x 부터는
사용자 정의 interface이름
+Impl
도 지원
=> MemberRepositoryCustomImpl도 OK!
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom{
private final EntityManager em;
@Override
public List<Member> findMemberCustom() {
return em.createQuery("select m from Member m")
.getResultList();
}
}
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom { MemberRepositoryCustom = 커스텀한 Repository 상속
...
}
@Test
public void callCustom(){
List<Member> result = memberRepository.findMemberCustom();
}
강사님의 경우)
QueryDSL
을 사용할 때, Custom해서 많이 사용한다고 하셨다.
실무에서는 주로 QueryDSL, SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능을 사용한다.
즉, Spring Data JPA로 해결할 수 없는 복잡한 동적쿼리를 짜야할 때 주로 사용한다.
핵심 비즈니스 로직
이 있는 Repository와 화면에 맞춘 DTO 뽑는 것
들을 Repository를 분리
=> Custom Interface 만드는 건 분리하는게 아님! 어짜피 상속 받을 거니까.
=> 아예 다른 Repository Class로 분리
항상 사용자 정의 리포지토리가 필요한 것은 아니다!
=> 그냥 별도의 Repository
를 interface가 아닌 Class로 만들어서 스프링 빈으로 등록
해 사용해도 된다!