1. 사용 배경
2. 사용 예시
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();
}
}
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
}
List<Member> result = memberRepository.findMemberCustom();
[주의] 사용자 정의 구현 클래스 생성시 주의사항
- "리포지토리 인터페이스 이름" + Impl (Ex. MemberRepositoryImpl)
- 📌 최근에는 "사용자 정의 인터페이스 이름" + Impl 방식도 지원 (Ex. MemberRepositoryCustomImpl)
- 사실 기존방식보다 이 방식이 사용자 정의 인터페이스 이름과 구현 클래스 이름이 연계되어 있어 직관적
- 상기 네이밍 규칙을 지켜야 spring data jpa가 인식해서 자동으로 스프링 빈으로 등록해줌
- 만약 Impl 대신 다른 이름으로 변경하고자 한다면 별도 설정이 가능하지만 권장하지 않음
실무에서는 주로 QueryDsl이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능을 자주 사용
[참고] 📌항상 사용자 정의 리포지토리가 필요한 것은 아니다!!!
필요시 임의의 리포지토리를 만들어서 스프링 빈으로 등록하여 직접 사용해도 됨
[참고] 📌커스텀이라고해서 사용자 정의 리포지토리에 모든걸 다 넣는건 아니다!!!
실무에서는 핵심 비즈니스 로직이 들어가있는 리포지토리 & 화면에 맞춘 메소드들이 들어가있는 리포지토리를 아예 분리하는 방식을 추천(다각적으로 고민해서 클래스를 쪼갤 것)