사용자 정의 리포지토리

Mina Park·2022년 10월 13일
0

1. 사용 배경

  • spring data jpa 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동생성
  • 그런데 spring data jpa가 제공하는 인터페이스를 직접 구현하면 구현해야하는 기능이 너무 ㅁ낳음
  • 모종의 이유로 인터페이스의 메소드를 직접 구현하고 싶다면?
    • JPA 직접 사용(EntityManager)
    • QueryDsl사용(가장 많은 경우)
    • 데이터베이스 커넥션 직접 사용, 스프링 JDBC Template 사용 등

2. 사용 예시

  • 사용자 정의 인터페이스
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();
    }
}
  • 사용자 정의 인터페이스 상속
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
}
  • 사용자 정의 메소드 호출 코드 예시
List<Member> result = memberRepository.findMemberCustom();

[주의] 사용자 정의 구현 클래스 생성시 주의사항

  • "리포지토리 인터페이스 이름" + Impl (Ex. MemberRepositoryImpl)
    • 📌 최근에는 "사용자 정의 인터페이스 이름" + Impl 방식도 지원 (Ex. MemberRepositoryCustomImpl)
    • 사실 기존방식보다 이 방식이 사용자 정의 인터페이스 이름과 구현 클래스 이름이 연계되어 있어 직관적
  • 상기 네이밍 규칙을 지켜야 spring data jpa가 인식해서 자동으로 스프링 빈으로 등록해줌
  • 만약 Impl 대신 다른 이름으로 변경하고자 한다면 별도 설정이 가능하지만 권장하지 않음

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

[참고] 📌항상 사용자 정의 리포지토리가 필요한 것은 아니다!!!
필요시 임의의 리포지토리를 만들어서 스프링 빈으로 등록하여 직접 사용해도 됨

[참고] 📌커스텀이라고해서 사용자 정의 리포지토리에 모든걸 다 넣는건 아니다!!!
실무에서는 핵심 비즈니스 로직이 들어가있는 리포지토리 & 화면에 맞춘 메소드들이 들어가있는 리포지토리를 아예 분리하는 방식을 추천(다각적으로 고민해서 클래스를 쪼갤 것)

0개의 댓글