13. 사용자 정의 Repository 구현

민정·2022년 12월 13일
0

Spring Data JPA

목록 보기
13/17
post-thumbnail

1) 사용자 정의 interface 생성

이름은 자유롭게 작성 가능!

public interface MemberRepositoryCustom {
    List<Member> findMemberCustom();
}

2) 사용자 정의 interface의 구현체

🚨주의🚨

사용자 정의 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();
    }
}

3) MemberRepository에 사용자 정의 Interface 상속

public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom { MemberRepositoryCustom = 커스텀한 Repository 상속
	...
}

✔ Test

    @Test
    public void callCustom(){
        List<Member> result = memberRepository.findMemberCustom();
    }

실행결과


🧐 사용자 정의 Interface는 언제 사용하는가?

강사님의 경우)
QueryDSL을 사용할 때, Custom해서 많이 사용한다고 하셨다.

실무에서는 주로 QueryDSL, SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능을 사용한다.

즉, Spring Data JPA로 해결할 수 없는 복잡한 동적쿼리를 짜야할 때 주로 사용한다.


📌 참고

  • 핵심 비즈니스 로직이 있는 Repository와 화면에 맞춘 DTO 뽑는 것들을 Repository를 분리
    => Custom Interface 만드는 건 분리하는게 아님! 어짜피 상속 받을 거니까.
    => 아예 다른 Repository Class로 분리

  • 항상 사용자 정의 리포지토리가 필요한 것은 아니다!
    => 그냥 별도의 Repository를 interface가 아닌 Class로 만들어서 스프링 빈으로 등록해 사용해도 된다!



출처

김영한 강사님 - 인프런 실전! 스프링 데이터 JPA

0개의 댓글