Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다.
사용자 정의 리포지토리 구현
사용자 정의 리포지토리 구현은 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하기에는 구현해야 하는 기능이 너무 많다. 그래서 그 중에 뽑아서 몇 개만 구현하고 싶거나, 혹은 JPA가 아닌 다른 Mybatis 등의 다른 리포지토리를 같이 쓰고 싶을 때 사용한다.
사용자 정의 리포지토리를 만드려면 일단 인터페이스 하나를 생성해야 한다.
- MemberRepositoryCustom.interface
public interface MemberRepositoryCustom {
List<Member> findMemberCustom();
}
그리고 이 인터페이스를 구현하는 구현 클래스를 생성해야 한다.
- MemberRepositoryCustomImpl.class
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom{
private final EntityManager em;
@Override
public List<Member> findMemberCustom() {
return em.createQuery("select m from Member m")
.getResultList();
}
}
그리고 MemberRepository가 Custom의 존재와 내부 메서드를 알아야하니 MemberRepository에서 Custom을 상속 받도록 한다.
- MemberRepository.interface
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
- MemberRepositoryTest.class
@Test
public void callCustom() {
List<Member> result = memberRepository.findMemberCustom();
}
select
member0_.member_id as member_i1_0_,
member0_.age as age2_0_,
member0_.team_id as team_id4_0_,
member0_.username as username3_0_
from
member member0_
잘 실행이 되는 걸 확인할 수 있다. 쉽게 실행할 수 있는데 한 가지 중요한 점이 있다. 바로 구현 클래스인 MemberRepositoryImpl.class는 이름에 규칙이 있다. MemberRepository(리포지토리 인터페이스 이름) + Impl을 맞춰줘야한다. 이 규칙만 맞추면 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록한다.
! 실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능을 사용한다.
Impl 말고 다른 이름으로 변경
XML 설정
<repositories base-package="study.datajpa.repository"
repository-impl-postfix="Impl" />
JavaConfig 설정
@EnableJpaRepositories(basePackage=
"study.datajpa.repository",
repositoryImplementationPostfix="Impl")
위의 두 가지 방법이 있지만 웬만해서는 그냥 일반적인 관례를 따르는 게 좋다.
최신 버전의 사용자 정의 리포지토리
스프링 데이터 2.x 부터는 사용자 정의 인터페이스 명 + Impl 방식도 스프링 빈으로 알아서 스프링 데이터 JPA 올린다. 위의 예제를 가져와 설명하자면 MemberRepositoryImpl말고 MemberRepositoryCustomImpl이 가능하다는 얘기이다. 후자의 이름 규칙을 사용하는 것이 개발하기에 더 직관적이므로 이 방식을 사용하는 것을 권장.