-
스프링 데이터 JPA에서의 사용자 정의 리포지토리JPA/스프링 데이터 JPA 2023. 8. 12. 14:20
스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동으로 생성해주는데 스프링 데이터 JPA가 제공해주는 인터페이스를 직접 구현하려면 구현해야할 것들이 너무 많다. 따라서 별도로 인터페이스를 만들어서 기능을 구현한 다음 그 인터페이스를 repository에서 상속받는 방법이 있다.
1. MemberRepositoryCustom을 만들어서 메서드를 선언만 한다.
public interface MemberRepositoryCustom { List<Member> findMemberCustom(); }
2. 선언한 인터페이스를 구현해서 JPQL을 작성한다. 이 때 이름은 repository 이름 + Impl로 맞춰야 한다.
@RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom { private final EntityManager em; @Override public List<Member> findMemberCustom() { return em.createQuery("select m from Member m") .getResultList(); } } // 클래스 이름은 repository 이름 + Impl로 맞춰야함
3. MemberRepository에서 JpaRepository 이외에 MemberRepositoryCustom도 상속 받는다.
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom { }
4. 테스트에서 memberRepository에서 findMemberCustom을 호출 가능
@Test public void callCustom() { List<Member> result = memberRepository.findMemberCustom(); }
MemberRepository만으로 해결이 되지 않고 별도의 쿼리를 사용해야할 때 이 기능을 사용한다.
만약에 화면에 맞춰서 복잡한 쿼리를 작성해야 할 때에는 Custom을 만들어서 상속을 받는 것보다 repository를 분리하는 것이 낫다.
'JPA > 스프링 데이터 JPA' 카테고리의 다른 글
Web 확장 - 페이징과 정렬 (0) 2023.08.12 Auditing - 엔티티의 생성 변경 기록 (0) 2023.08.12 JPA Hint (0) 2023.08.12 @EntityGraph - 어노테이션으로 fetch join (0) 2023.08.12 벌크성 수정 쿼리 (0) 2023.08.11