스프링 데이터 JPA가 제공하는 기능으로 정의 가능한 쿼리, 메서드는 JpaRepository를 상속하는 (1)MemberRepository 인터페이스에 정의한다.
동적 쿼리 같은 복잡한 쿼리는 (2)사용자 정의 리포지토리에 정의하거나, (3)별도의 클래스를 만들어 JPA와 별개로 사용한다.
사용자 정의 리포지토리의 이름은 JpaRepository를 상속하는 인터페이스 명에 Impl을 붙인 이름이어야 한다. (ex, MemberRepositoryImpl)
예를 들어, 위 그림에서 search() 메서드를 실행할 때 memberRepository.search()
와 같이 paRepository를 상속하는 인터페이스를 통해 메서드를 호출한다. 즉 사용자 정의 리포지토리를 사용한다는 것은, 결국 JpaRepository를 상속하는 인터페이스(MemberRepository)가 커지고 복잡해지는 것이다.
따라서 핵심 비즈니스 로직과 관련된 메서드는 JpaRepository를 상속하는 인터페이스 또는 사용자 정의 리포지토리에 정의하고, 화면이나 dto에 특화된 메서드는 별도의 클래스에 정의하여 분리하자!