프로그래밍/JPA
스프링 데이터 JPA - 사용자 정의 리포지토리 구현 (내가 원했던 내용 그럼 복잡한 쿼리는 어떻게 구현해?)
duburani
2023. 6. 20. 21:12
스프링 데이터 JPA가 아주 잘 만들어 졌지만.. 실무에서는 사실 복잡한 쿼리를 사용할 일이 많다
그럴때 쿼리를 구현해줘야하는데 인터페이스 안에 구현할 수 없다..! 이를 해결하기 위해 스프링 데이터 JPA가 제공하는 방식이 있다.
사용자 정의 리포지토리 구현
1. 임의의 interface를 만든다. (예시 MemberRepositoryCustom)
2. MemberRepositoryCustom 안에 구현하고자 하는 메소드를 정의한다.
public interface MemberRepositoryCustom {
List<Member> findMemberCustom();
}
3. 1번에서 만든 인터페이스를 상속받을 클래스를 만든다. 이때 클래스이름은 사용자정의 인터페이스 + Impl 로 지정해야한다.
사용자 정의 구현 클래스 규칙:
- 리포지토리 인터페이스 이름 + Impl 또는 사용자정의 인터페이스명 + Impl
- 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom{
private final EntityManager em;
@Override
public List<Member> findMemberCustom() {
return em.createQuery("select m from Member m").getResultList();
}
}
@RequiredArgsConstructor
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom{
private final EntityManager em;
@Override
public List<Member> findMemberCustom() {
return em.createQuery("select m from Member m").getResultList();
}
}
4. 사용자정의 인터페이스를 상속 받는다.
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
}
+)
실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용하기 위해 사용자 정의 리포지토리 기능을 자주 사용한다고 한다.
하지만 이 기능이 항상 필요한 것은 아니다.
모든 걸 이 커스텀 기능에 몰아서 구현할 필요가 없고 핵심 비즈니스 로직과 단순 기능을 분리해서 구현하는 것을 권장한다.