1 분 소요

사용자 정의 리포지토리 구현

  • 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성

  • 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음

  • 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면?

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

예제로 만든 MemberRepository가 점점 복잡해진다.

여기서 EntityManager를 사용한 추가적인 메서드를 만들고, 다른 메서드를 만들면 더 복잡해 질 것이다.

이때 사용하는 것이 사용자 정의 인터페이스다.

사용자 정의 인터페이스

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

다음과 같이 커스텀 인터페이스를 하나 만들었다. 이제 이거를 내가 필요한 기능으로 구현해 보자.

1
2
3
4
5
6
7
8
9
10
@RequiredArgsConstructor  
public class MemberRepositoryImpl implements MemberRepositoryCustom{  
  
    private final EntityManager em;  
  
    @Override  
    public List<Member> findMemberCustom() {  
        return em.createQuery("select m from Member m", Member.class).getResultList();  
    }  
}

이런 식으로 Impl 클래스를 만들어서 내가 필요한 기능을 구현했다.

이제 어떻게 사용 하냐면, 아까 지저분하던 MemberRepository로 가서

다음과 같이 인터페이스 끼리 상속 해버리면 된다.

그럼 알아서 스프링이 MemberRepositoryImplfindMemberCustom()을 사용해 준다.

주의 사항 : 반드시 구현 클래스는 Impl로 끝나야 한다. 안 그러면 스프링이 찾지 못한다. 정 다르게 하고 싶으면 jpa-Custom Repository Implementations 스프링 공식 문서에서 설정하는 방법을 알려 준다. 꼭 참고 하길 바람.

1
2
3
4
5
@Test  
public void callCustom() throws Exception {  
    //given  
    List<Member> result = memberRepository.findMemberCustom();  
}

아무튼 이렇게 사용해 보면

원하는 쿼리가 잘 나간 걸 볼 수 있다.

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

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

커멘드와 쿼리를 분리하고 핵심과 추가 기능을 분리하자. 그렇다고 하나에 매몰되지는 말자.

태그: ,

카테고리:

업데이트:

댓글남기기