Spring Data JPA 사용자 정의 리포지토리

Aiden Shin·2020년 3월 14일
0

Spring Data JPA 에서는 리포지토리의 인터페이스만 정의하고 구현은 스프링이 자동으로 생성해준다.

하지만 다양한 이유로 인터페이스의 메서드를 직접 구현해야할 때가 있다.

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

나의 경우 복잡한 데이터의 조회나 동적 쿼리가 필요한 경우 Querydsl을 주로 사용하는데 이 때 사용자 정의 리포지토리를 정의하여 사용한다.

사용자 정의 리포지토리를 정의하는 방법은 다음과 같다


// 사용자 정의 인터페이스 작성
public interface MemberRepositoryCustom {
      List<Member> findMemberCustom();      
}
// 사용자 정의 인터페이스 구현체 작성
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom {
   
   private final EntityManager em;
   
   @Override
   public List<Member> findMemberCustom() {
      return em.createQuery("select m from Member m") .getResultList();
   } 
}

사용자 정의 인터페이스를 작성 후 구현체를 작성한다. 구현체를 작성할 때 주의할 점은 리포지토리 인터페이스 이름 + Impl 형태로 구현체를 작성해야한다는 점이다.
이 규칙으로 작성해야 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록해준다.
물론 이 규칙을 설정을 통해 다른 방식으로 바꿀 수 있지만.. 그냥 사용하는 것이 좋아보인다

// 사용자 정의 인터페이스 상속
public interface MemberRepository
           extends JpaRepository<Member, Long>, MemberRepositoryCustom {
}
// 사용
List<Member> result = memberRepository.findMemberCustom();

작성한 사용자 정의 인터페이스를 기존 리포지토리에 상속받아 사용할 수 있다.
이 방식의 장점은 기존 리포지토리 인터페이스에서 사용자 정의 인터페이스의 기능들을 사용할 수 있다는 것이다.
그리고 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 엄청나게 많은데 그런 과정을 생략하고 구현하고자 하는 기능만 구현하면 된다.


위 방법을 무조건 사용하는 것보다 때에 다라서 리포지토리를 분리해야할 필요도 있다.
예를 들어 공통적으로 사용되는 도메인 핵심 기능이 아닌 특정한 것(관리자메뉴, 혹은 특정 화면)에 종속적인 쿼리 같은 경우 기능 별로 리포지토리를 분리하여 사용하는 것이 더 효율적일 것 같다.
하지만 공통적으로 사용되는 기능의 경우 위 방법으로 커스텀 리포지토리를 정의함으로써 효율적으로 사용할 수 있을 것 같다.

profile
예전 블로그: https://shinilhyun.github.io/

0개의 댓글