[실전! 스프링 데이터 JPA] 사용자 정의 리포지토리

강신현·2022년 8월 12일
0

필요성

다양한 이유로 인해 인터페이스의 메서드를 직접 구현해야 하는 경우에 사용한다.
(스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음..)

  • JPA 직접 사용( EntityManager )
  • 스프링 JDBC Template 사용
  • MyBatis 사용
  • 데이터베이스 커넥션 직접 사용
  • Querydsl 사용

구현

[리포지토리 인터페이스 이름 + Impl] or [사용자 정의 인터페이스 명 + Impl] 로 만들면
스프링 데이터 JPA가 인식해서 스프링 빈으로 등록한다.

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

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

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

1) [리포지토리 인터페이스 이름 + 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();
    }
}

2) or [사용자 정의 인터페이스 명 + Impl]

  • 사용자 정의 인터페이스 이름과 구현 클래스 이름이 비슷하므로 더 직관적이고
  • 추가로 여러 인터페이스를 분리해서 구현하는 것도 가능하기 때문에
    👉 이 방식을 사용하는 것을 더 권장한다.
@RequiredArgsConstructor
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {

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

3. 사용자 정의 인터페이스 상속

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

4. 사용자 정의 메서드 호출

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

활용

실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능을 자주 사용한다.

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


강의 출처

[인프런 - 김영한] 실전! 스프링 데이터 JPA

profile
땅콩의 모험 (server)

0개의 댓글