빡코

[스프링 데이터 JPA] 사용자 정의 리포지토리 구현 본문

Java/JPA

[스프링 데이터 JPA] 사용자 정의 리포지토리 구현

chris.djang 2023. 5. 11. 21:40

1. 사용자 정의 인터페이스 생성 

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

2. 사용자 정의 인터페이스를 구현할 구현 클래스 생성 

@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom {

    private final EntityManager em;

    @Override
    public List<Member> findMemberCustom() {
        return em.createQuery("select m from Member m")
                .getResultList();
    }
}

* 사용자 정의 리포지토리 구현시, 구현 클래스 명명 규칙 

JpaRepository 인터페이스를 구현한 메인 repository 클래스 이름 + Impl

 

3. 기존 리포지토리에서 사용자 정의 인터페이스 상속 

public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
}

4.테스트 클래스 

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

 

 

또 다른 방법 ? 

 

항상 사용자정의리포지토리가 필요한 것은 아니다. 그냥 임의의 리포지토리를 만들어도 된다. 예를 들어 MemberQueryRepository를 인터페이스가 아닌 클래스로 만들고 스프링빈으로 등록해서 그냥 직접 사용해도 된다. 물론 이경우 스프링데이터 JPA와는 아무런 관계없이 별도로 동작한다

 

일반 Repository 클래스 생성 

@Repository
@RequiredArgsConstructor
public class MemberQueryRepository {

    private final EntityManager em;

    List<Member> findAllMembers() {
        return em.createQuery("select m from Member m")
                .getResultList();
    }
}

구현 클래스에 주입 받아 사용 

@Rollback(value = false)
class MemberRepositoryTest {
    @Autowired MemberQueryRepository memberQueryRepository;
}