다양한 이유로 인해 인터페이스의 메서드를 직접 구현해야 하는 경우에 사용한다.
(스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음..)
[리포지토리 인터페이스 이름 + Impl] or [사용자 정의 인터페이스 명 + Impl] 로 만들면
스프링 데이터 JPA가 인식해서 스프링 빈으로 등록한다.
public interface MemberRepositoryCustom {
List<Member> findMemberCustom();
}
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom{
private final EntityManager em;
@Override
public List<Member> findMemberCustom() {
return em.createQuery("select m from Member m")
.getResultList();
}
}
@RequiredArgsConstructor
public class MemberRepositoryCustomImpl 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 {
...
}
@Test
public void callCustom(){
List<Member> result = memberRepository.findMemberCustom();
}
실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능을 자주 사용한다.
꼭 사용자 정의 리포지토리로 만들어야 하는 것은 아니고, 임의의 리포지토리를 만들어서 사용해도 된다.
예를들어 MemberQueryRepository를 인터페이스가 아닌 클래스로 만들고 스프링 빈으로 등록해서 그냥 직접 사용하는 것이다.
물론 이 경우 스프링 데이터 JPA와는 아무런 관계 없이 별도로 동작한다.