프로그래밍/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을 함께 사용하기 위해 사용자 정의 리포지토리 기능을 자주 사용한다고 한다.

 

하지만 이 기능이 항상 필요한 것은 아니다.

모든 걸 이 커스텀 기능에 몰아서 구현할 필요가 없고 핵심 비즈니스 로직과 단순 기능을 분리해서 구현하는 것을 권장한다.