JPA/스프링 데이터 JPA

스프링 데이터 JPA에서의 사용자 정의 리포지토리

chanhee01 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를 분리하는 것이 낫다.