ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 데이터 JPA에서의 사용자 정의 리포지토리
    JPA/스프링 데이터 JPA 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를 분리하는 것이 낫다.

    'JPA > 스프링 데이터 JPA' 카테고리의 다른 글

    Web 확장 - 페이징과 정렬  (0) 2023.08.12
    Auditing - 엔티티의 생성 변경 기록  (0) 2023.08.12
    JPA Hint  (0) 2023.08.12
    @EntityGraph - 어노테이션으로 fetch join  (0) 2023.08.12
    벌크성 수정 쿼리  (0) 2023.08.11
Designed by Tistory.