본문 바로가기

Spring Data JPA

3월 23일 SpringDataJPA 사용자 정의 리포지토리 구현

사용자 정의 리포지토리 구현 (실무에서 중요)

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

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

다른 이유로 인터페이스와 메서드를 직접 구현하고 싶다면?

 

-JPA를 직접사용(EntityManager)

-스프링 JDBC Template 사용

-MyBatis 사용

-데이터 베이스 커넥션 직접 사용 등등

-Query DSL 사용 등

 

위 기능을 데이터 JPA에서 사용하고 싶을 경우 

커스텀한 기능 하나마 쓰고 싶을 경우 사용자 인터페이스 인터페이스를 만든다.

 

1.MemberRepositoryCustom , Interface 생성 ( 기능 명시)

public interface MemberRepositoryCustom{

 List<Member> findMemberCustom();

}

 

2.구현체 Impl Class 생성

@RequiredArgsConstructor

public class MemberRespositoryImpl implements MemberRepositrotCustom{

 private final EntityManager em;

}

 

@Override

public List<Member> findMemberCustom(){//jpql 을 사용

 return em.createQuery("select m from Member m")

 .getResultList();

}

 

3.기존 Repository 에 연결

public interface MemberRepository extends JPARepository<Member , Long> , MemberRepositoryCustom

MemberRepositoryCustom (인터페이스)를 상속받고

그 구현체를 호출하면

MemberRepository.findMemberCustom()

그 인터페이스는 기능이 구현된 class Impl에 로직으로 spring이 연결해 준다.

 

간단한 기능은 데이터 JPA를 사용하고 복잡한건 커스텀을 이용해서 사용

 

그런데 Imple class에 규칙이 하나 있는데

연결할 Repository (MemberRepository)와 이름을 맞춰 주어야 한다.

MemberRepositroy + Impl 

이걸 맞춰주어야 spring이 메서드를 찾아준다.

 

사용자 저으이 레포지토리가 항상 필요한건 아니다.

무분별한 사용은 좋지 않다.

핵심 비즈니스 로직과 화면용 DTO로직을 분리해주는게 좋다.

Repository를 분리